hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
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_ */