blob: 29d0e1f104d2bcdf6f15dc245351b2109a038cee (
plain) (
blame)
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
|
/*
* drivers/media/radio/si4713-i2c.h
*
* Property and commands definitions for Si4713 radio transmitter chip.
*
* Copyright (c) 2008 Instituto Nokia de Tecnologia - INdT
* Contact: Eduardo Valentin <eduardo.valentin@nokia.com>
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*
*/
#ifndef SI4713_I2C_H
#define SI4713_I2C_H
#include <linux/platform_device.h>
#include <linux/regulator/consumer.h>
#include <linux/gpio/consumer.h>
#include <media/v4l2-subdev.h>
#include <media/v4l2-ctrls.h>
#include <linux/platform_data/media/si4713.h>
#define SI4713_PRODUCT_NUMBER 0x0D
/* Command Timeouts */
#define DEFAULT_TIMEOUT 500
#define TIMEOUT_SET_PROPERTY 20
#define TIMEOUT_TX_TUNE_POWER 30000
#define TIMEOUT_TX_TUNE 110000
#define TIMEOUT_POWER_UP 200000
/*
* Command and its arguments definitions
*/
#define SI4713_PWUP_CTSIEN (1<<7)
#define SI4713_PWUP_GPO2OEN (1<<6)
#define SI4713_PWUP_PATCH (1<<5)
#define SI4713_PWUP_XOSCEN (1<<4)
#define SI4713_PWUP_FUNC_TX 0x02
#define SI4713_PWUP_FUNC_PATCH 0x0F
#define SI4713_PWUP_OPMOD_ANALOG 0x50
#define SI4713_PWUP_OPMOD_DIGITAL 0x0F
#define SI4713_PWUP_NARGS 2
#define SI4713_PWUP_NRESP 1
#define SI4713_CMD_POWER_UP 0x01
#define SI4713_GETREV_NRESP 9
#define SI4713_CMD_GET_REV 0x10
#define SI4713_PWDN_NRESP 1
#define SI4713_CMD_POWER_DOWN 0x11
#define SI4713_SET_PROP_NARGS 5
#define SI4713_SET_PROP_NRESP 1
#define SI4713_CMD_SET_PROPERTY 0x12
#define SI4713_GET_PROP_NARGS 3
#define SI4713_GET_PROP_NRESP 4
#define SI4713_CMD_GET_PROPERTY 0x13
#define SI4713_GET_STATUS_NRESP 1
#define SI4713_CMD_GET_INT_STATUS 0x14
#define SI4713_CMD_PATCH_ARGS 0x15
#define SI4713_CMD_PATCH_DATA 0x16
#define SI4713_MAX_FREQ 10800
#define SI4713_MIN_FREQ 7600
#define SI4713_TXFREQ_NARGS 3
#define SI4713_TXFREQ_NRESP 1
#define SI4713_CMD_TX_TUNE_FREQ 0x30
#define SI4713_MAX_POWER 120
#define SI4713_MIN_POWER 88
#define SI4713_MAX_ANTCAP 191
#define SI4713_MIN_ANTCAP 0
#define SI4713_TXPWR_NARGS 4
#define SI4713_TXPWR_NRESP 1
#define SI4713_CMD_TX_TUNE_POWER 0x31
#define SI4713_TXMEA_NARGS 4
#define SI4713_TXMEA_NRESP 1
#define SI4713_CMD_TX_TUNE_MEASURE 0x32
#define SI4713_INTACK_MASK 0x01
#define SI4713_TXSTATUS_NARGS 1
#define SI4713_TXSTATUS_NRESP 8
#define SI4713_CMD_TX_TUNE_STATUS 0x33
#define SI4713_OVERMOD_BIT (1 << 2)
#define SI4713_IALH_BIT (1 << 1)
#define SI4713_IALL_BIT (1 << 0)
#define SI4713_ASQSTATUS_NARGS 1
#define SI4713_ASQSTATUS_NRESP 5
#define SI4713_CMD_TX_ASQ_STATUS 0x34
#define SI4713_RDSBUFF_MODE_MASK 0x87
#define SI4713_RDSBUFF_NARGS 7
#define SI4713_RDSBUFF_NRESP 6
#define SI4713_CMD_TX_RDS_BUFF 0x35
#define SI4713_RDSPS_PSID_MASK 0x1F
#define SI4713_RDSPS_NARGS 5
#define SI4713_RDSPS_NRESP 1
#define SI4713_CMD_TX_RDS_PS 0x36
#define SI4713_CMD_GPO_CTL 0x80
#define SI4713_CMD_GPO_SET 0x81
/*
* Bits from status response
*/
#define SI4713_CTS (1<<7)
#define SI4713_ERR (1<<6)
#define SI4713_RDS_INT (1<<2)
#define SI4713_ASQ_INT (1<<1)
#define SI4713_STC_INT (1<<0)
/*
* Property definitions
*/
#define SI4713_GPO_IEN 0x0001
#define SI4713_DIG_INPUT_FORMAT 0x0101
#define SI4713_DIG_INPUT_SAMPLE_RATE 0x0103
#define SI4713_REFCLK_FREQ 0x0201
#define SI4713_REFCLK_PRESCALE 0x0202
#define SI4713_TX_COMPONENT_ENABLE 0x2100
#define SI4713_TX_AUDIO_DEVIATION 0x2101
#define SI4713_TX_PILOT_DEVIATION 0x2102
#define SI4713_TX_RDS_DEVIATION 0x2103
#define SI4713_TX_LINE_INPUT_LEVEL 0x2104
#define SI4713_TX_LINE_INPUT_MUTE 0x2105
#define SI4713_TX_PREEMPHASIS 0x2106
#define SI4713_TX_PILOT_FREQUENCY 0x2107
#define SI4713_TX_ACOMP_ENABLE 0x2200
#define SI4713_TX_ACOMP_THRESHOLD 0x2201
#define SI4713_TX_ACOMP_ATTACK_TIME 0x2202
#define SI4713_TX_ACOMP_RELEASE_TIME 0x2203
#define SI4713_TX_ACOMP_GAIN 0x2204
#define SI4713_TX_LIMITER_RELEASE_TIME 0x2205
#define SI4713_TX_ASQ_INTERRUPT_SOURCE 0x2300
#define SI4713_TX_ASQ_LEVEL_LOW 0x2301
#define SI4713_TX_ASQ_DURATION_LOW 0x2302
#define SI4713_TX_ASQ_LEVEL_HIGH 0x2303
#define SI4713_TX_ASQ_DURATION_HIGH 0x2304
#define SI4713_TX_RDS_INTERRUPT_SOURCE 0x2C00
#define SI4713_TX_RDS_PI 0x2C01
#define SI4713_TX_RDS_PS_MIX 0x2C02
#define SI4713_TX_RDS_PS_MISC 0x2C03
#define SI4713_TX_RDS_PS_REPEAT_COUNT 0x2C04
#define SI4713_TX_RDS_PS_MESSAGE_COUNT 0x2C05
#define SI4713_TX_RDS_PS_AF 0x2C06
#define SI4713_TX_RDS_FIFO_SIZE 0x2C07
#define PREEMPHASIS_USA 75
#define PREEMPHASIS_EU 50
#define PREEMPHASIS_DISABLED 0
#define FMPE_USA 0x00
#define FMPE_EU 0x01
#define FMPE_DISABLED 0x02
#define POWER_UP 0x01
#define POWER_DOWN 0x00
#define MAX_RDS_PTY 31
#define MAX_RDS_DEVIATION 90000
/*
* PSNAME is known to be defined as 8 character sized (RDS Spec).
* However, there is receivers which scroll PSNAME 8xN sized.
*/
#define MAX_RDS_PS_NAME 96
/*
* MAX_RDS_RADIO_TEXT is known to be defined as 32 (2A group) or 64 (2B group)
* character sized (RDS Spec).
* However, there is receivers which scroll them as well.
*/
#define MAX_RDS_RADIO_TEXT 384
#define MAX_LIMITER_RELEASE_TIME 102390
#define MAX_LIMITER_DEVIATION 90000
#define MAX_PILOT_DEVIATION 90000
#define MAX_PILOT_FREQUENCY 19000
#define MAX_ACOMP_RELEASE_TIME 1000000
#define MAX_ACOMP_ATTACK_TIME 5000
#define MAX_ACOMP_THRESHOLD 0
#define MIN_ACOMP_THRESHOLD (-40)
#define MAX_ACOMP_GAIN 20
/*
* si4713_device - private data
*/
struct si4713_device {
/* v4l2_subdev and i2c reference (v4l2_subdev priv data) */
struct v4l2_subdev sd;
struct v4l2_ctrl_handler ctrl_handler;
/* private data structures */
struct { /* si4713 control cluster */
/* This is one big cluster since the mute control
* powers off the device and after unmuting again all
* controls need to be set at once. The only way of doing
* that is by making it one big cluster. */
struct v4l2_ctrl *mute;
struct v4l2_ctrl *rds_ps_name;
struct v4l2_ctrl *rds_radio_text;
struct v4l2_ctrl *rds_pi;
struct v4l2_ctrl *rds_deviation;
struct v4l2_ctrl *rds_pty;
struct v4l2_ctrl *rds_compressed;
struct v4l2_ctrl *rds_art_head;
struct v4l2_ctrl *rds_stereo;
struct v4l2_ctrl *rds_ta;
struct v4l2_ctrl *rds_tp;
struct v4l2_ctrl *rds_ms;
struct v4l2_ctrl *rds_dyn_pty;
struct v4l2_ctrl *rds_alt_freqs_enable;
struct v4l2_ctrl *rds_alt_freqs;
struct v4l2_ctrl *compression_enabled;
struct v4l2_ctrl *compression_threshold;
struct v4l2_ctrl *compression_gain;
struct v4l2_ctrl *compression_attack_time;
struct v4l2_ctrl *compression_release_time;
struct v4l2_ctrl *pilot_tone_enabled;
struct v4l2_ctrl *pilot_tone_freq;
struct v4l2_ctrl *pilot_tone_deviation;
struct v4l2_ctrl *limiter_enabled;
struct v4l2_ctrl *limiter_deviation;
struct v4l2_ctrl *limiter_release_time;
struct v4l2_ctrl *tune_preemphasis;
struct v4l2_ctrl *tune_pwr_level;
struct v4l2_ctrl *tune_ant_cap;
};
struct completion work;
struct regulator *vdd;
struct regulator *vio;
struct gpio_desc *gpio_reset;
struct platform_device *pd;
u32 power_state;
u32 rds_enabled;
u32 frequency;
u32 preemphasis;
u32 stereo;
u32 tune_rnl;
};
struct radio_si4713_platform_data {
struct i2c_client *subdev;
};
#endif /* ifndef SI4713_I2C_H */
|