aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc/irrc.h
blob: c1bfc724c9e090541653412065999cdd5e733358 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

/*
 * Macros for register offset
 */
#define IRRC_VERSION(base_adr)		(base_adr+0x0000)
#define IRRC_MODE(base_adr)		(base_adr+0x0004)
#define IRRC_DMA(base_adr)		(base_adr+0x0008)
#define IRRC_FIFO_STAT(base_adr)	(base_adr+0x000c)
#define IRRC_MOD_INST(base_adr)		(base_adr+0x0010)
#define IRRC_CCLK_HT(base_adr)		(base_adr+0x0014)
#define IRRC_CCLK_LT(base_adr)		(base_adr+0x0018)
#define IRRC_BCLK_DIV(base_adr)		(base_adr+0x001c)
//#define IRRC_OUTP_INV(base_adr)		(base_adr+0x0020)
#define IRRC_WR_STAT(base_adr)		(base_adr+0x0020)
#define IRRC_IRQ_STAT(base_adr)		(base_adr+0x0024)
#define IRRC_IRQ_RAW_STAT(base_adr)	(base_adr+0x0028)
#define IRRC_IRQ_EN_STAT(base_adr)	(base_adr+0x002c)
#define IRRC_IRQ_EN(base_adr)		(base_adr+0x0030)
#define IRRC_IRQ_DISEN(base_adr)	(base_adr+0x0034)
#define IRRC_IRQ_CLR(base_adr)		(base_adr+0x0038)
#define IRRC_IRQ_FORCE(base_adr)	(base_adr+0x003c)
#define IRRC_SW_TEST(base_adr)		(base_adr+0x0040)

#define IRRC_IRQ_STAT_FRAME_END		(0x00000001)
#define IRRC_IRQ_STAT_FIFO_FULL		(0x00000002)
#define IRRC_IRQ_STAT_FIFO_UNDERFLOW	(0x00000004)
#define IRRC_IRQ_STAT_FIFO_EMPTY	(0x00000008)
#define IRRC_IRQ_STAT_FIFO_HALF_EMPTY	(0x00000010)

#define IRRC_IRQ_CLEAR_FRAME_END	(0x00000001)
#define IRRC_IRQ_CLEAR_FIFO_FULL	(0x00000002)
#define IRRC_IRQ_CLEAR_FIFO_UNDERFLOW	(0x00000004)
#define IRRC_IRQ_CLEAR_FIFO_EMPTY	(0x00000008)
#define IRRC_IRQ_CLEAR_FIFO_HALF_EMPTY	(0x00000010)

#define IRRC_IRQ_ON_FRAME_END		(0x00000001)
#define IRRC_IRQ_ON_FIFO_FULL		(0x00000002)
#define IRRC_IRQ_ON_FIFO_UNDERFLOW	(0x00000004)
#define IRRC_IRQ_ON_FIFO_EMPTY		(0x00000008)
#define IRRC_IRQ_ON_FIFO_HALF_EMPTY	(0x00000010)

#define IRRC_WR_STATUS_MASK_CCLK_HT	(0x00000001)
#define IRRC_WR_STATUS_MASK_CCLK_LT	(0x00000002)
#define IRRC_WR_STATUS_MASK_BCCLK	(0x00000004)

#define IRRC_BIT_SET			(0xFFFFFFFF)
#define IRRC_BIT_CLEAR			(0x00000000)



/*
 * Macro for writing and reading register
 */
#define IRRC_RD_REG_32(adr)        	   readl(adr)
#define IRRC_WR_REG_32(adr, value)        writel(adr, value)
#define IRRC_WR_FLD_32(adr, mask, value)  writel(adr, (readl(adr) & ~(mask)) | ((value) & (mask)))



/*
 * Private
 */
#define DEFAULT_CARRIER_HIGH       1000
#define DEFAULT_CARRIER_LOW        1000
#define DEFAULT_MODULATION_METHOD  HAL_IRRC_MODULATION_METHOD_HIGHLOW_HIGHLOW
#define DEFAULT_DATA_0_HIGH        5000
#define DEFAULT_DATA_0_LOW         5000
#define DEFAULT_DATA_1_HIGH        10000
#define DEFAULT_DATA_1_LOW         10000
#define DEFAULT_START_HIGH         20000
#define DEFAULT_START_LOW          20000
#define DEFAULT_STOP_HIGH          30000
#define DEFAULT_REPEAT_COUNT       1
#define DEFAULT_REPEAT_INTERVAL    100


#define IRRC_MOD_INST_MASK                                (0xE003FFFF)
//NOT USED                                                  (0x1FFC0000)
#define IRRC_MOD_INST_RWMASK                              (0x00000000)
#define IRRC_MOD_INST_VALID_MASK                          (0x80000000)
#define IRRC_MOD_INST_VALID_OK                            (0x80000000)
#define IRRC_MOD_INST_VALID_NOT_OK                        (0x00000000)
#define IRRC_MOD_INST_OUTP_STATE_MASK                     (0x40000000)
#define IRRC_MOD_INST_OUTP_STATE_ACTIVE                   (0x40000000)
#define IRRC_MOD_INST_OUTP_STATE_INACTIVE                 (0x00000000)
#define IRRC_MOD_INST_OUTP_SEL_MASK                       (0x20000000)
#define IRRC_MOD_INST_OUTP_SEL_FORCED_HIGH                (0x20000000)
#define IRRC_MOD_INST_OUTP_SEL_CARRIER                    (0x00000000)
#define IRRC_MOD_INST_PERIOD_MASK                         (0x0003FFFF)

#define ALIAS 			"irrc"
#define MINOR_DEV_NR		0
#define NR_OF_DEVICE 		1				// Not negotiable! Shall allways be 1 (code does not support more than one device instance)
#define MAJOR_DEV_NR		0				// if set to 0 the setting of major number will be dynamicaly.

#define HW_BLOCK_CLK_DURATION		21			//period time of the block HW clock, in nanosecs

#undef PDEBUG
#ifdef IRRC_DEBUG
#	define PDEBUG(fmt, args...) printk( KERN_DEBUG "irrc_"fmt, ## args)
#else
#	define PDEBUG(fmt, args...)
#endif

#undef SDEBUG
#define SDEBUG(fmt, args...)


#include <linux/timer.h>

typedef enum pulses {
	START_HIGH,
	START_LOW,
	STOP_HIGH,
	ZERO_HIGH,
	ZERO_LOW,
	ONE_HIGH,
	ONE_LOW,
	NO_OF_PULSE_TYPES
} irrc_pulses_t;

typedef enum irrc_mux {
	MUX_DEFAULT,
	MUX_IRRC,
} irrc_mux_t;

typedef enum status {
	NO_CLEANUP,
	INIT_ADD_DEVICE,
	INIT_CREATE_DEVICE,
	INIT_ALLOC_REGISTER_REGION,
//	INIT_MISC_DEVICE,
	INIT_CREATE_CLASS_DEVICE,
	EXIT_BASIC

} status_t;

struct irrc_list {
	u32 				       *encoded_buff_p;
	unsigned long int 			count;
	unsigned long int 			interval;
	unsigned long int 			carrier_high;
	unsigned long int 			carrier_low;
	unsigned long int			common_divisor;
	struct irrc_list		       *next_tx_list_p;
	struct timer_list		        timer;

};

struct irrc_device {

	struct semaphore 			mutex;			// mutual exclusion semaphore
	struct tasklet_struct			tasklet;
//	struct cdev 				cdev;	  		// Char device structure
	struct miscdevice			misc_dev;
//	struct class   			       *irrc_class_p;
	struct irrc_list 		       *last_tx_list_p;
	struct irrc_list		       *current_tx_list_p;
	int					user_count;
	int					user_owner;
};