2019-05-29 07:17:59 -07:00
/* SPDX-License-Identifier: GPL-2.0-only */
2009-12-11 08:34:07 -03:00
/*
* Remote Controller core header
*
2014-02-07 08:03:07 -02:00
* Copyright ( C ) 2009 - 2010 by Mauro Carvalho Chehab
2009-12-11 08:34:07 -03:00
*/
2010-11-17 13:53:11 -03:00
# ifndef _RC_CORE
# define _RC_CORE
2009-12-11 08:34:07 -03:00
# include <linux/spinlock.h>
2017-09-26 09:34:47 -04:00
# include <linux/cdev.h>
2010-03-20 20:59:44 -03:00
# include <linux/kfifo.h>
# include <linux/time.h>
2010-03-21 13:00:55 -03:00
# include <linux/timer.h>
2010-04-02 20:01:00 -03:00
# include <media/rc-map.h>
2009-12-11 08:34:07 -03:00
2016-07-17 09:16:57 -03:00
/**
2017-09-24 05:24:58 -04:00
* enum rc_driver_type - type of the RC driver .
2016-07-17 09:16:57 -03:00
*
2017-09-24 05:24:58 -04:00
* @ RC_DRIVER_SCANCODE : Driver or hardware generates a scancode .
2016-12-16 04:12:15 -02:00
* @ RC_DRIVER_IR_RAW : Driver or hardware generates pulse / space sequences .
* It needs a Infra - Red pulse / space decoder
* @ RC_DRIVER_IR_RAW_TX : Device transmitter only ,
* driver requires pulse / space data sequence .
2016-07-17 09:16:57 -03:00
*/
2010-04-06 23:21:46 -03:00
enum rc_driver_type {
2016-07-17 09:16:57 -03:00
RC_DRIVER_SCANCODE = 0 ,
RC_DRIVER_IR_RAW ,
2016-12-16 04:12:15 -02:00
RC_DRIVER_IR_RAW_TX ,
2010-04-06 23:21:46 -03:00
} ;
2014-01-17 10:58:49 -03:00
/**
* struct rc_scancode_filter - Filter scan codes .
* @ data : Scancode data to match .
* @ mask : Mask of bits of scancode to compare .
*/
struct rc_scancode_filter {
u32 data ;
u32 mask ;
} ;
/**
* enum rc_filter_type - Filter type constants .
* @ RC_FILTER_NORMAL : Filter for normal operation .
* @ RC_FILTER_WAKEUP : Filter for waking from suspend .
* @ RC_FILTER_MAX : Number of filter types .
*/
enum rc_filter_type {
RC_FILTER_NORMAL = 0 ,
RC_FILTER_WAKEUP ,
RC_FILTER_MAX
} ;
2017-11-02 17:21:13 -04:00
/**
* struct lirc_fh - represents an open lirc file
* @ list : list of open file handles
* @ rc : rcdev for this lirc chardev
* @ carrier_low : when setting the carrier range , first the low end must be
* set with an ioctl and then the high end with another ioctl
* @ rawir : queue for incoming raw IR
* @ scancodes : queue for incoming decoded scancodes
* @ wait_poll : poll struct for lirc device
* @ send_mode : lirc mode for sending , either LIRC_MODE_SCANCODE or
* LIRC_MODE_PULSE
* @ rec_mode : lirc mode for receiving , either LIRC_MODE_SCANCODE or
* LIRC_MODE_MODE2
*/
struct lirc_fh {
struct list_head list ;
struct rc_dev * rc ;
int carrier_low ;
DECLARE_KFIFO_PTR ( rawir , unsigned int ) ;
DECLARE_KFIFO_PTR ( scancodes , struct lirc_scancode ) ;
wait_queue_head_t wait_poll ;
u8 send_mode ;
u8 rec_mode ;
} ;
2010-04-04 14:06:55 -03:00
/**
2010-10-29 16:08:23 -03:00
* struct rc_dev - represents a remote control device
* @ dev : driver model ' s view of this device
2016-09-30 17:42:07 -03:00
* @ managed_alloc : devm_rc_allocate_device was used to create rc_dev
2014-04-04 19:06:06 -03:00
* @ sysfs_groups : sysfs attribute groups
2017-07-01 12:13:19 -04:00
* @ device_name : name of the rc child device
2010-10-29 16:08:23 -03:00
* @ input_phys : physical path to the input child device
* @ input_id : id of the input child device ( struct input_id )
* @ driver_name : name of the hardware driver which registered this device
* @ map_name : name of the default keymap
2010-11-17 14:28:27 -03:00
* @ rc_map : current scan / key table
2011-05-11 15:14:31 -03:00
* @ lock : used to ensure we ' ve filled in all protocol details before
* anyone can call show_protocols or store_protocols
2015-05-19 19:03:17 -03:00
* @ minor : unique minor remote control device number
2010-10-29 16:08:23 -03:00
* @ raw : additional data for raw pulse / space devices
* @ input_dev : the input child device used to communicate events to userspace
2011-05-11 15:14:31 -03:00
* @ driver_type : specifies if protocol decoding is done in hardware or software
2010-10-29 16:08:23 -03:00
* @ idle : used to keep track of RX state
2015-03-31 14:48:10 -03:00
* @ encode_wakeup : wakeup filtering uses IR encode API , therefore the allowed
* wakeup protocols is the set of all raw encoders
2017-08-07 16:20:58 -04:00
* @ allowed_protocols : bitmask with the supported RC_PROTO_BIT_ * protocols
* @ enabled_protocols : bitmask with the enabled RC_PROTO_BIT_ * protocols
* @ allowed_wakeup_protocols : bitmask with the supported RC_PROTO_BIT_ * wakeup
* protocols
* @ wakeup_protocol : the enabled RC_PROTO_ * wakeup protocol or
* RC_PROTO_UNKNOWN if disabled .
2014-04-03 20:32:21 -03:00
* @ scancode_filter : scancode filter
* @ scancode_wakeup_filter : scancode wakeup filters
2014-04-03 20:32:26 -03:00
* @ scancode_mask : some hardware decoders are not capable of providing the full
2010-04-04 14:06:55 -03:00
* scancode to the application . As this is a hardware limit , we can ' t do
* anything with it . Yet , as the same keycode table can be used with other
* devices , a mask is provided to allow its usage . Drivers should generally
* leave this field in blank
2014-04-03 20:32:26 -03:00
* @ users : number of current users of the device
2010-10-29 16:08:23 -03:00
* @ priv : driver - specific data
* @ keylock : protects the remaining members of the struct
* @ keypressed : whether a key is currently pressed
* @ keyup_jiffies : time ( in jiffies ) when the current keypress should be released
* @ timer_keyup : timer for releasing a keypress
2017-11-23 17:37:10 -05:00
* @ timer_repeat : timer for autorepeat events . This is needed for CEC , which
* has non - standard repeats .
2010-10-29 16:08:23 -03:00
* @ last_keycode : keycode of last keypress
2014-04-03 20:31:30 -03:00
* @ last_protocol : protocol of last keypress
2010-10-29 16:08:23 -03:00
* @ last_scancode : scancode of last keypress
* @ last_toggle : toggle value of last command
2010-07-31 11:59:22 -03:00
* @ timeout : optional time after which device stops sending data
* @ min_timeout : minimum timeout supported by device
* @ max_timeout : maximum timeout supported by device
2020-08-23 19:23:05 +02:00
* @ rx_resolution : resolution ( in us ) of input sampler
* @ tx_resolution : resolution ( in us ) of output sampler
2017-09-26 09:34:47 -04:00
* @ lirc_dev : lirc device
* @ lirc_cdev : lirc char cdev
2022-01-13 12:29:01 +01:00
* @ gap_start : start time for gap after timeout if non - zero
2017-11-02 17:21:13 -04:00
* @ lirc_fh_lock : protects lirc_fh list
* @ lirc_fh : list of open files
2017-09-26 07:31:29 -04:00
* @ registered : set to true by rc_register_device ( ) , false by
* rc_unregister_device
2010-04-04 14:06:55 -03:00
* @ change_protocol : allow changing the protocol used on hardware decoders
* @ open : callback to allow drivers to enable polling / irq when IR input device
* is opened .
* @ close : callback to allow drivers to disable polling / irq when IR input device
* is opened .
2010-06-16 17:55:25 -03:00
* @ s_tx_mask : set transmitter mask ( for devices with multiple tx outputs )
* @ s_tx_carrier : set transmit carrier frequency
2010-07-31 11:59:23 -03:00
* @ s_tx_duty_cycle : set transmit duty cycle ( 0 % - 100 % )
2015-08-22 05:25:45 -03:00
* @ s_rx_carrier_range : inform driver about carrier it is expected to handle
2010-06-16 17:55:25 -03:00
* @ tx_ir : transmit IR
2010-10-29 16:08:23 -03:00
* @ s_idle : enable / disable hardware idle mode , upon which ,
* device doesn ' t interrupt host until it sees IR pulses
2021-07-03 11:04:40 +02:00
* @ s_wideband_receiver : enable wide band receiver used for learning
2010-10-16 19:56:28 -03:00
* @ s_carrier_report : enable carrier reports
2014-04-03 20:31:30 -03:00
* @ s_filter : set the scancode filter
2016-12-05 17:08:35 -02:00
* @ s_wakeup_filter : set the wakeup scancode filter . If the mask is zero
* then wakeup should be disabled . wakeup_protocol will be set to
* a valid protocol if mask is nonzero .
2020-08-23 19:23:05 +02:00
* @ s_timeout : set hardware timeout in us
2010-04-04 14:06:55 -03:00
*/
2010-10-29 16:08:23 -03:00
struct rc_dev {
struct device dev ;
2016-09-30 17:42:07 -03:00
bool managed_alloc ;
2014-04-04 19:06:06 -03:00
const struct attribute_group * sysfs_groups [ 5 ] ;
2017-07-01 12:13:19 -04:00
const char * device_name ;
2010-10-29 16:08:23 -03:00
const char * input_phys ;
struct input_id input_id ;
2017-07-01 12:13:19 -04:00
const char * driver_name ;
2010-10-29 16:08:23 -03:00
const char * map_name ;
2011-05-11 15:14:31 -03:00
struct rc_map rc_map ;
struct mutex lock ;
2015-05-19 19:03:17 -03:00
unsigned int minor ;
2010-10-29 16:08:23 -03:00
struct ir_raw_event_ctrl * raw ;
struct input_dev * input_dev ;
enum rc_driver_type driver_type ;
2010-07-31 11:59:22 -03:00
bool idle ;
2015-03-31 14:48:10 -03:00
bool encode_wakeup ;
2014-04-03 20:32:21 -03:00
u64 allowed_protocols ;
u64 enabled_protocols ;
u64 allowed_wakeup_protocols ;
2017-08-07 16:20:58 -04:00
enum rc_proto wakeup_protocol ;
2014-04-03 20:32:21 -03:00
struct rc_scancode_filter scancode_filter ;
struct rc_scancode_filter scancode_wakeup_filter ;
2014-04-03 20:32:26 -03:00
u32 scancode_mask ;
2013-07-22 04:22:57 -03:00
u32 users ;
2010-10-29 16:08:23 -03:00
void * priv ;
spinlock_t keylock ;
bool keypressed ;
unsigned long keyup_jiffies ;
struct timer_list timer_keyup ;
2017-11-23 17:37:10 -05:00
struct timer_list timer_repeat ;
2010-10-29 16:08:23 -03:00
u32 last_keycode ;
2017-08-07 16:20:58 -04:00
enum rc_proto last_protocol ;
2020-01-17 17:46:36 +01:00
u64 last_scancode ;
2010-10-29 16:08:23 -03:00
u8 last_toggle ;
u32 timeout ;
u32 min_timeout ;
u32 max_timeout ;
u32 rx_resolution ;
u32 tx_resolution ;
2017-09-23 10:41:13 -04:00
# ifdef CONFIG_LIRC
2017-09-26 09:34:47 -04:00
struct device lirc_dev ;
struct cdev lirc_cdev ;
2017-09-23 10:41:13 -04:00
ktime_t gap_start ;
2017-11-02 17:21:13 -04:00
spinlock_t lirc_fh_lock ;
struct list_head lirc_fh ;
2017-09-23 10:41:13 -04:00
# endif
2017-09-26 07:31:29 -04:00
bool registered ;
2017-08-07 16:20:58 -04:00
int ( * change_protocol ) ( struct rc_dev * dev , u64 * rc_proto ) ;
2010-10-29 16:08:23 -03:00
int ( * open ) ( struct rc_dev * dev ) ;
void ( * close ) ( struct rc_dev * dev ) ;
int ( * s_tx_mask ) ( struct rc_dev * dev , u32 mask ) ;
int ( * s_tx_carrier ) ( struct rc_dev * dev , u32 carrier ) ;
int ( * s_tx_duty_cycle ) ( struct rc_dev * dev , u32 duty_cycle ) ;
int ( * s_rx_carrier_range ) ( struct rc_dev * dev , u32 min , u32 max ) ;
2011-04-28 12:13:58 -03:00
int ( * tx_ir ) ( struct rc_dev * dev , unsigned * txbuf , unsigned n ) ;
2010-10-29 16:08:23 -03:00
void ( * s_idle ) ( struct rc_dev * dev , bool enable ) ;
2021-07-03 11:04:40 +02:00
int ( * s_wideband_receiver ) ( struct rc_dev * dev , int enable ) ;
2010-10-29 16:08:23 -03:00
int ( * s_carrier_report ) ( struct rc_dev * dev , int enable ) ;
2014-01-17 10:58:49 -03:00
int ( * s_filter ) ( struct rc_dev * dev ,
struct rc_scancode_filter * filter ) ;
2014-04-04 19:06:01 -03:00
int ( * s_wakeup_filter ) ( struct rc_dev * dev ,
struct rc_scancode_filter * filter ) ;
2016-07-10 13:34:38 -03:00
int ( * s_timeout ) ( struct rc_dev * dev ,
unsigned int timeout ) ;
2009-12-11 09:44:23 -03:00
} ;
2010-03-20 20:59:44 -03:00
2010-11-17 13:53:11 -03:00
# define to_rc_dev(d) container_of(d, struct rc_dev, dev)
/*
* From rc - main . c
* Those functions can be used on any type of Remote Controller . They
* basically creates an input_dev and properly reports the device as a
* Remote Controller , at sys / class / rc .
*/
2016-07-17 09:16:57 -03:00
/**
* rc_allocate_device - Allocates a RC device
*
2016-12-16 06:50:58 -02:00
* @ rc_driver_type : specifies the type of the RC output to be allocated
2016-07-17 09:16:57 -03:00
* returns a pointer to struct rc_dev .
*/
2016-12-16 06:50:58 -02:00
struct rc_dev * rc_allocate_device ( enum rc_driver_type ) ;
2016-07-17 09:16:57 -03:00
2016-09-30 17:42:07 -03:00
/**
* devm_rc_allocate_device - Managed RC device allocation
*
* @ dev : pointer to struct device
2016-12-16 06:50:58 -02:00
* @ rc_driver_type : specifies the type of the RC output to be allocated
2016-09-30 17:42:07 -03:00
* returns a pointer to struct rc_dev .
*/
2016-12-16 06:50:58 -02:00
struct rc_dev * devm_rc_allocate_device ( struct device * dev , enum rc_driver_type ) ;
2016-09-30 17:42:07 -03:00
2016-07-17 09:16:57 -03:00
/**
* rc_free_device - Frees a RC device
*
* @ dev : pointer to struct rc_dev .
*/
2010-11-17 13:53:11 -03:00
void rc_free_device ( struct rc_dev * dev ) ;
2016-07-17 09:16:57 -03:00
/**
* rc_register_device - Registers a RC device
*
* @ dev : pointer to struct rc_dev .
*/
2010-11-17 13:53:11 -03:00
int rc_register_device ( struct rc_dev * dev ) ;
2016-07-17 09:16:57 -03:00
2016-09-30 17:42:07 -03:00
/**
* devm_rc_register_device - Manageded registering of a RC device
*
* @ parent : pointer to struct device .
* @ dev : pointer to struct rc_dev .
*/
int devm_rc_register_device ( struct device * parent , struct rc_dev * dev ) ;
2016-07-17 09:16:57 -03:00
/**
* rc_unregister_device - Unregisters a RC device
*
* @ dev : pointer to struct rc_dev .
*/
2010-11-17 13:53:11 -03:00
void rc_unregister_device ( struct rc_dev * dev ) ;
void rc_repeat ( struct rc_dev * dev ) ;
2020-01-17 17:46:36 +01:00
void rc_keydown ( struct rc_dev * dev , enum rc_proto protocol , u64 scancode ,
2017-08-07 16:20:58 -04:00
u8 toggle ) ;
void rc_keydown_notimeout ( struct rc_dev * dev , enum rc_proto protocol ,
2020-01-17 17:46:36 +01:00
u64 scancode , u8 toggle ) ;
2010-11-17 13:53:11 -03:00
void rc_keyup ( struct rc_dev * dev ) ;
2020-01-17 17:46:36 +01:00
u32 rc_g_keycode_from_table ( struct rc_dev * dev , u64 scancode ) ;
2010-11-17 13:53:11 -03:00
/*
* From rc - raw . c
* The Raw interface is specific to InfraRed . It may be a good idea to
* split it later into a separate header .
*/
2010-04-15 18:46:00 -03:00
struct ir_raw_event {
2010-10-16 19:56:28 -03:00
union {
u32 duration ;
2016-03-17 16:39:13 -03:00
u32 carrier ;
2010-10-16 19:56:28 -03:00
} ;
2016-03-17 16:39:13 -03:00
u8 duty_cycle ;
2010-10-16 19:56:28 -03:00
unsigned pulse : 1 ;
2022-01-15 11:12:35 +01:00
unsigned overflow : 1 ;
2010-10-16 19:56:28 -03:00
unsigned timeout : 1 ;
unsigned carrier_report : 1 ;
2010-04-15 18:46:00 -03:00
} ;
2011-01-06 16:59:36 -03:00
# define US_TO_NS(usec) ((usec) * 1000)
# define MS_TO_US(msec) ((msec) * 1000)
2020-08-23 19:23:05 +02:00
# define IR_MAX_DURATION MS_TO_US(500)
# define IR_DEFAULT_TIMEOUT MS_TO_US(125)
2021-07-05 19:56:01 +02:00
# define IR_MAX_TIMEOUT LIRC_VALUE_MASK
2010-04-15 18:46:00 -03:00
2010-10-29 16:08:23 -03:00
void ir_raw_event_handle ( struct rc_dev * dev ) ;
int ir_raw_event_store ( struct rc_dev * dev , struct ir_raw_event * ev ) ;
2017-08-07 08:38:10 -04:00
int ir_raw_event_store_edge ( struct rc_dev * dev , bool pulse ) ;
2010-10-29 16:08:23 -03:00
int ir_raw_event_store_with_filter ( struct rc_dev * dev ,
2018-03-08 09:42:44 -05:00
struct ir_raw_event * ev ) ;
int ir_raw_event_store_with_timeout ( struct rc_dev * dev ,
struct ir_raw_event * ev ) ;
2010-10-29 16:08:23 -03:00
void ir_raw_event_set_idle ( struct rc_dev * dev , bool idle ) ;
2017-08-07 16:20:58 -04:00
int ir_raw_encode_scancode ( enum rc_proto protocol , u32 scancode ,
2015-03-31 14:48:06 -03:00
struct ir_raw_event * events , unsigned int max ) ;
2017-02-25 06:51:30 -05:00
int ir_raw_encode_carrier ( enum rc_proto protocol ) ;
2010-07-31 11:59:22 -03:00
2022-01-15 11:12:35 +01:00
static inline void ir_raw_event_overflow ( struct rc_dev * dev )
2010-04-15 18:46:00 -03:00
{
2022-01-15 11:12:35 +01:00
ir_raw_event_store ( dev , & ( ( struct ir_raw_event ) { . overflow = true } ) ) ;
2018-05-10 16:41:15 -04:00
dev - > idle = true ;
2010-10-29 16:08:23 -03:00
ir_raw_event_handle ( dev ) ;
2010-04-15 18:46:00 -03:00
}
2010-04-08 13:10:00 -03:00
2010-10-29 16:08:12 -03:00
/* extract mask bits out of data and pack them into the result */
static inline u32 ir_extract_bits ( u32 data , u32 mask )
{
u32 vbit = 1 , value = 0 ;
do {
2010-11-19 20:43:27 -03:00
if ( mask & 1 ) {
if ( data & 1 )
value | = vbit ;
vbit < < = 1 ;
}
data > > = 1 ;
2010-10-29 16:08:12 -03:00
} while ( mask > > = 1 ) ;
return value ;
}
2017-07-30 09:23:11 -04:00
/* Get NEC scancode and protocol type from address and command bytes */
static inline u32 ir_nec_bytes_to_scancode ( u8 address , u8 not_address ,
u8 command , u8 not_command ,
2017-08-07 16:20:58 -04:00
enum rc_proto * protocol )
2017-07-30 09:23:11 -04:00
{
u32 scancode ;
if ( ( command ^ not_command ) ! = 0xff ) {
/* NEC transport, but modified protocol, used by at
* least Apple and TiVo remotes
*/
scancode = not_address < < 24 |
address < < 16 |
not_command < < 8 |
command ;
2017-08-07 16:20:58 -04:00
* protocol = RC_PROTO_NEC32 ;
2017-07-30 09:23:11 -04:00
} else if ( ( address ^ not_address ) ! = 0xff ) {
/* Extended NEC */
scancode = address < < 16 |
not_address < < 8 |
command ;
2017-08-07 16:20:58 -04:00
* protocol = RC_PROTO_NECX ;
2017-07-30 09:23:11 -04:00
} else {
/* Normal NEC */
scancode = address < < 8 | command ;
2017-08-07 16:20:58 -04:00
* protocol = RC_PROTO_NEC ;
2017-07-30 09:23:11 -04:00
}
return scancode ;
}
2010-11-17 13:53:11 -03:00
# endif /* _RC_CORE */