blob: db0642f0fac4db96764e5001a388062580225ab3 [file] [log] [blame]
/*
* include/linux/amlogic/irblaster_encoder.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef __LINUX_ENCODER_H
#define __LINUX_ENCODER_H
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/of.h>
struct irblaster_chip;
int irblaster_send(struct irblaster_chip *chip, unsigned int *data,
unsigned int len);
static DEFINE_MUTEX(irblaster_raw_handler_lock);
static LIST_HEAD(irblaster_raw_handler_list);
/**
* enum irblaster_protocol - protocol of irblaster
* add a new protocol here
* @IRBLASTER_PROTOCOL_MAX: Maximum number of support protocol
* please add a new protocol before this
*/
enum irblaster_protocol {
IRBLASTER_PROTOCOL_NEC,
IRBLASTER_PROTOCOL_NECX,
IRBLASTER_PROTOCOL_NEC32,
IRBLASTER_PROTOCOL_RCA,
IRBLASTER_PROTOCOL_MAX
};
#define IRBLASTER_PROTOCOL_BIT_NEC BIT_ULL(IRBLASTER_PROTOCOL_NEC)
#define IRBLASTER_PROTOCOL_BIT_NECX BIT_ULL(IRBLASTER_PROTOCOL_NECX)
#define IRBLASTER_PROTOCOL_BIT_NEC32 BIT_ULL(IRBLASTER_PROTOCOL_NEC32)
#define IRBLASTER_PROTOCOL_BIT_RCA BIT_ULL(IRBLASTER_PROTOCOL_RCA)
/**
* struct irblaster_raw_timings - pulse-length modulation timings
* @header_pulse: duration of header pulse in ns (0 for none)
* @bit_space: duration of bit space in ns
* @bit_pulse: duration of bit pulse (for logic 0 and 1) in ns
* @trailer_space: duration of trailer space in ns
* @msb_first: 1 if most significant bit is sent first
* @raw_nbits: raw bit len
* @data_size: the total length of the array
*/
struct irblaster_raw_timings {
unsigned int header_pulse;
unsigned int header_space;
unsigned int bit_pulse;
unsigned int bit_space[2];
unsigned int trailer_pulse;
unsigned int trailer_space;
unsigned int msb_first:1;
unsigned int raw_nbits;
unsigned int data_size;
};
struct irblaster_raw_handler {
struct list_head list;
char *name;
int protocol; /* which are handled by this handler */
int (*encode)(enum irblaster_protocol protocol, unsigned int addr,
unsigned int commmand, unsigned int *data);
struct irblaster_raw_timings *timing;
struct mutex encode_lock; /* use to function encode */
u32 freq;
u32 duty;
};
/* irblaster encode APIs */
int irblaster_raw_handler_register(struct irblaster_raw_handler
*ir_raw_handler);
void irblaster_raw_handler_unregister(struct irblaster_raw_handler
*ir_raw_handler);
int irblaster_raw_gen(unsigned int *data,
const struct irblaster_raw_timings *timings,
u32 raw);
unsigned int protocol_store_select(const char *buf);
unsigned int protocol_show_select(struct irblaster_chip *chip, char *buf);
#endif /* __LINUX_ENCODER_H */