summaryrefslogtreecommitdiffstats
path: root/kernel/drivers/media/rc/img-ir/img-ir.h
blob: f1387c016d3d27c7969d3bcb345b0f661612bdaf (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
162
163
164
165
166
167
168
169
170
171
172
173
/*
 * ImgTec IR Decoder found in PowerDown Controller.
 *
 * Copyright 2010-2014 Imagination Technologies Ltd.
 *
 * 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.
 */

#ifndef _IMG_IR_H_
#define _IMG_IR_H_

#include <linux/io.h>
#include <linux/spinlock.h>

#include "img-ir-raw.h"
#include "img-ir-hw.h"

/* registers */

/* relative to the start of the IR block of registers */
#define IMG_IR_CONTROL		0x00
#define IMG_IR_STATUS		0x04
#define IMG_IR_DATA_LW		0x08
#define IMG_IR_DATA_UP		0x0c
#define IMG_IR_LEAD_SYMB_TIMING	0x10
#define IMG_IR_S00_SYMB_TIMING	0x14
#define IMG_IR_S01_SYMB_TIMING	0x18
#define IMG_IR_S10_SYMB_TIMING	0x1c
#define IMG_IR_S11_SYMB_TIMING	0x20
#define IMG_IR_FREE_SYMB_TIMING	0x24
#define IMG_IR_POW_MOD_PARAMS	0x28
#define IMG_IR_POW_MOD_ENABLE	0x2c
#define IMG_IR_IRQ_MSG_DATA_LW	0x30
#define IMG_IR_IRQ_MSG_DATA_UP	0x34
#define IMG_IR_IRQ_MSG_MASK_LW	0x38
#define IMG_IR_IRQ_MSG_MASK_UP	0x3c
#define IMG_IR_IRQ_ENABLE	0x40
#define IMG_IR_IRQ_STATUS	0x44
#define IMG_IR_IRQ_CLEAR	0x48
#define IMG_IR_IRCORE_ID	0xf0
#define IMG_IR_CORE_REV		0xf4
#define IMG_IR_CORE_DES1	0xf8
#define IMG_IR_CORE_DES2	0xfc


/* field masks */

/* IMG_IR_CONTROL */
#define IMG_IR_DECODEN		0x40000000
#define IMG_IR_CODETYPE		0x30000000
#define IMG_IR_CODETYPE_SHIFT		28
#define IMG_IR_HDRTOG		0x08000000
#define IMG_IR_LDRDEC		0x04000000
#define IMG_IR_DECODINPOL	0x02000000	/* active high */
#define IMG_IR_BITORIEN		0x01000000	/* MSB first */
#define IMG_IR_D1VALIDSEL	0x00008000
#define IMG_IR_BITINV		0x00000040	/* don't invert */
#define IMG_IR_DECODEND2	0x00000010
#define IMG_IR_BITORIEND2	0x00000002	/* MSB first */
#define IMG_IR_BITINVD2		0x00000001	/* don't invert */

/* IMG_IR_STATUS */
#define IMG_IR_RXDVALD2		0x00001000
#define IMG_IR_IRRXD		0x00000400
#define IMG_IR_TOGSTATE		0x00000200
#define IMG_IR_RXDVAL		0x00000040
#define IMG_IR_RXDLEN		0x0000003f
#define IMG_IR_RXDLEN_SHIFT		0

/* IMG_IR_LEAD_SYMB_TIMING, IMG_IR_Sxx_SYMB_TIMING */
#define IMG_IR_PD_MAX		0xff000000
#define IMG_IR_PD_MAX_SHIFT		24
#define IMG_IR_PD_MIN		0x00ff0000
#define IMG_IR_PD_MIN_SHIFT		16
#define IMG_IR_W_MAX		0x0000ff00
#define IMG_IR_W_MAX_SHIFT		8
#define IMG_IR_W_MIN		0x000000ff
#define IMG_IR_W_MIN_SHIFT		0

/* IMG_IR_FREE_SYMB_TIMING */
#define IMG_IR_MAXLEN		0x0007e000
#define IMG_IR_MAXLEN_SHIFT		13
#define IMG_IR_MINLEN		0x00001f00
#define IMG_IR_MINLEN_SHIFT		8
#define IMG_IR_FT_MIN		0x000000ff
#define IMG_IR_FT_MIN_SHIFT		0

/* IMG_IR_POW_MOD_PARAMS */
#define IMG_IR_PERIOD_LEN	0x3f000000
#define IMG_IR_PERIOD_LEN_SHIFT		24
#define IMG_IR_PERIOD_DUTY	0x003f0000
#define IMG_IR_PERIOD_DUTY_SHIFT	16
#define IMG_IR_STABLE_STOP	0x00003f00
#define IMG_IR_STABLE_STOP_SHIFT	8
#define IMG_IR_STABLE_START	0x0000003f
#define IMG_IR_STABLE_START_SHIFT	0

/* IMG_IR_POW_MOD_ENABLE */
#define IMG_IR_POWER_OUT_EN	0x00000002
#define IMG_IR_POWER_MOD_EN	0x00000001

/* IMG_IR_IRQ_ENABLE, IMG_IR_IRQ_STATUS, IMG_IR_IRQ_CLEAR */
#define IMG_IR_IRQ_DEC2_ERR	0x00000080
#define IMG_IR_IRQ_DEC_ERR	0x00000040
#define IMG_IR_IRQ_ACT_LEVEL	0x00000020
#define IMG_IR_IRQ_FALL_EDGE	0x00000010
#define IMG_IR_IRQ_RISE_EDGE	0x00000008
#define IMG_IR_IRQ_DATA_MATCH	0x00000004
#define IMG_IR_IRQ_DATA2_VALID	0x00000002
#define IMG_IR_IRQ_DATA_VALID	0x00000001
#define IMG_IR_IRQ_ALL		0x000000ff
#define IMG_IR_IRQ_EDGE		(IMG_IR_IRQ_FALL_EDGE | IMG_IR_IRQ_RISE_EDGE)

/* IMG_IR_CORE_ID */
#define IMG_IR_CORE_ID		0x00ff0000
#define IMG_IR_CORE_ID_SHIFT		16
#define IMG_IR_CORE_CONFIG	0x0000ffff
#define IMG_IR_CORE_CONFIG_SHIFT	0

/* IMG_IR_CORE_REV */
#define IMG_IR_DESIGNER		0xff000000
#define IMG_IR_DESIGNER_SHIFT		24
#define IMG_IR_MAJOR_REV	0x00ff0000
#define IMG_IR_MAJOR_REV_SHIFT		16
#define IMG_IR_MINOR_REV	0x0000ff00
#define IMG_IR_MINOR_REV_SHIFT		8
#define IMG_IR_MAINT_REV	0x000000ff
#define IMG_IR_MAINT_REV_SHIFT		0

struct device;
struct clk;

/**
 * struct img_ir_priv - Private driver data.
 * @dev:		Platform device.
 * @irq:		IRQ number.
 * @clk:		Input clock.
 * @sys_clk:		System clock.
 * @reg_base:		Iomem base address of IR register block.
 * @lock:		Protects IR registers and variables in this struct.
 * @raw:		Driver data for raw decoder.
 * @hw:			Driver data for hardware decoder.
 */
struct img_ir_priv {
	struct device		*dev;
	int			irq;
	struct clk		*clk;
	struct clk		*sys_clk;
	void __iomem		*reg_base;
	spinlock_t		lock;

	struct img_ir_priv_raw	raw;
	struct img_ir_priv_hw	hw;
};

/* Hardware access */

static inline void img_ir_write(struct img_ir_priv *priv,
				unsigned int reg_offs, unsigned int data)
{
	iowrite32(data, priv->reg_base + reg_offs);
}

static inline unsigned int img_ir_read(struct img_ir_priv *priv,
				       unsigned int reg_offs)
{
	return ioread32(priv->reg_base + reg_offs);
}

#endif /* _IMG_IR_H_ */