hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
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 */