• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * drivers/media/radio/si4713-i2c.h
3  *
4  * Property and commands definitions for Si4713 radio transmitter chip.
5  *
6  * Copyright (c) 2008 Instituto Nokia de Tecnologia - INdT
7  * Contact: Eduardo Valentin <eduardo.valentin@nokia.com>
8  *
9  * This file is licensed under the terms of the GNU General Public License
10  * version 2. This program is licensed "as is" without any warranty of any
11  * kind, whether express or implied.
12  *
13  */
14 
15 #ifndef SI4713_I2C_H
16 #define SI4713_I2C_H
17 
18 #include <media/v4l2-subdev.h>
19 #include <media/v4l2-ctrls.h>
20 #include <media/si4713.h>
21 
22 #define SI4713_PRODUCT_NUMBER		0x0D
23 
24 /* Command Timeouts */
25 #define DEFAULT_TIMEOUT			500
26 #define TIMEOUT_SET_PROPERTY		20
27 #define TIMEOUT_TX_TUNE_POWER		30000
28 #define TIMEOUT_TX_TUNE			110000
29 #define TIMEOUT_POWER_UP		200000
30 
31 /*
32  * Command and its arguments definitions
33  */
34 #define SI4713_PWUP_CTSIEN		(1<<7)
35 #define SI4713_PWUP_GPO2OEN		(1<<6)
36 #define SI4713_PWUP_PATCH		(1<<5)
37 #define SI4713_PWUP_XOSCEN		(1<<4)
38 #define SI4713_PWUP_FUNC_TX		0x02
39 #define SI4713_PWUP_FUNC_PATCH		0x0F
40 #define SI4713_PWUP_OPMOD_ANALOG	0x50
41 #define SI4713_PWUP_OPMOD_DIGITAL	0x0F
42 #define SI4713_PWUP_NARGS		2
43 #define SI4713_PWUP_NRESP		1
44 #define SI4713_CMD_POWER_UP		0x01
45 
46 #define SI4713_GETREV_NRESP		9
47 #define SI4713_CMD_GET_REV		0x10
48 
49 #define SI4713_PWDN_NRESP		1
50 #define SI4713_CMD_POWER_DOWN		0x11
51 
52 #define SI4713_SET_PROP_NARGS		5
53 #define SI4713_SET_PROP_NRESP		1
54 #define SI4713_CMD_SET_PROPERTY		0x12
55 
56 #define SI4713_GET_PROP_NARGS		3
57 #define SI4713_GET_PROP_NRESP		4
58 #define SI4713_CMD_GET_PROPERTY		0x13
59 
60 #define SI4713_GET_STATUS_NRESP		1
61 #define SI4713_CMD_GET_INT_STATUS	0x14
62 
63 #define SI4713_CMD_PATCH_ARGS		0x15
64 #define SI4713_CMD_PATCH_DATA		0x16
65 
66 #define SI4713_MAX_FREQ			10800
67 #define SI4713_MIN_FREQ			7600
68 #define SI4713_TXFREQ_NARGS		3
69 #define SI4713_TXFREQ_NRESP		1
70 #define SI4713_CMD_TX_TUNE_FREQ		0x30
71 
72 #define SI4713_MAX_POWER		120
73 #define SI4713_MIN_POWER		88
74 #define SI4713_MAX_ANTCAP		191
75 #define SI4713_MIN_ANTCAP		0
76 #define SI4713_TXPWR_NARGS		4
77 #define SI4713_TXPWR_NRESP		1
78 #define SI4713_CMD_TX_TUNE_POWER	0x31
79 
80 #define SI4713_TXMEA_NARGS		4
81 #define SI4713_TXMEA_NRESP		1
82 #define SI4713_CMD_TX_TUNE_MEASURE	0x32
83 
84 #define SI4713_INTACK_MASK		0x01
85 #define SI4713_TXSTATUS_NARGS		1
86 #define SI4713_TXSTATUS_NRESP		8
87 #define SI4713_CMD_TX_TUNE_STATUS	0x33
88 
89 #define SI4713_OVERMOD_BIT		(1 << 2)
90 #define SI4713_IALH_BIT			(1 << 1)
91 #define SI4713_IALL_BIT			(1 << 0)
92 #define SI4713_ASQSTATUS_NARGS		1
93 #define SI4713_ASQSTATUS_NRESP		5
94 #define SI4713_CMD_TX_ASQ_STATUS	0x34
95 
96 #define SI4713_RDSBUFF_MODE_MASK	0x87
97 #define SI4713_RDSBUFF_NARGS		7
98 #define SI4713_RDSBUFF_NRESP		6
99 #define SI4713_CMD_TX_RDS_BUFF		0x35
100 
101 #define SI4713_RDSPS_PSID_MASK		0x1F
102 #define SI4713_RDSPS_NARGS		5
103 #define SI4713_RDSPS_NRESP		1
104 #define SI4713_CMD_TX_RDS_PS		0x36
105 
106 #define SI4713_CMD_GPO_CTL		0x80
107 #define SI4713_CMD_GPO_SET		0x81
108 
109 /*
110  * Bits from status response
111  */
112 #define SI4713_CTS			(1<<7)
113 #define SI4713_ERR			(1<<6)
114 #define SI4713_RDS_INT			(1<<2)
115 #define SI4713_ASQ_INT			(1<<1)
116 #define SI4713_STC_INT			(1<<0)
117 
118 /*
119  * Property definitions
120  */
121 #define SI4713_GPO_IEN			0x0001
122 #define SI4713_DIG_INPUT_FORMAT		0x0101
123 #define SI4713_DIG_INPUT_SAMPLE_RATE	0x0103
124 #define SI4713_REFCLK_FREQ		0x0201
125 #define SI4713_REFCLK_PRESCALE		0x0202
126 #define SI4713_TX_COMPONENT_ENABLE	0x2100
127 #define SI4713_TX_AUDIO_DEVIATION	0x2101
128 #define SI4713_TX_PILOT_DEVIATION	0x2102
129 #define SI4713_TX_RDS_DEVIATION		0x2103
130 #define SI4713_TX_LINE_INPUT_LEVEL	0x2104
131 #define SI4713_TX_LINE_INPUT_MUTE	0x2105
132 #define SI4713_TX_PREEMPHASIS		0x2106
133 #define SI4713_TX_PILOT_FREQUENCY	0x2107
134 #define SI4713_TX_ACOMP_ENABLE		0x2200
135 #define SI4713_TX_ACOMP_THRESHOLD	0x2201
136 #define SI4713_TX_ACOMP_ATTACK_TIME	0x2202
137 #define SI4713_TX_ACOMP_RELEASE_TIME	0x2203
138 #define SI4713_TX_ACOMP_GAIN		0x2204
139 #define SI4713_TX_LIMITER_RELEASE_TIME	0x2205
140 #define SI4713_TX_ASQ_INTERRUPT_SOURCE	0x2300
141 #define SI4713_TX_ASQ_LEVEL_LOW		0x2301
142 #define SI4713_TX_ASQ_DURATION_LOW	0x2302
143 #define SI4713_TX_ASQ_LEVEL_HIGH	0x2303
144 #define SI4713_TX_ASQ_DURATION_HIGH	0x2304
145 #define SI4713_TX_RDS_INTERRUPT_SOURCE	0x2C00
146 #define SI4713_TX_RDS_PI		0x2C01
147 #define SI4713_TX_RDS_PS_MIX		0x2C02
148 #define SI4713_TX_RDS_PS_MISC		0x2C03
149 #define SI4713_TX_RDS_PS_REPEAT_COUNT	0x2C04
150 #define SI4713_TX_RDS_PS_MESSAGE_COUNT	0x2C05
151 #define SI4713_TX_RDS_PS_AF		0x2C06
152 #define SI4713_TX_RDS_FIFO_SIZE		0x2C07
153 
154 #define PREEMPHASIS_USA			75
155 #define PREEMPHASIS_EU			50
156 #define PREEMPHASIS_DISABLED		0
157 #define FMPE_USA			0x00
158 #define FMPE_EU				0x01
159 #define FMPE_DISABLED			0x02
160 
161 #define POWER_UP			0x01
162 #define POWER_DOWN			0x00
163 
164 #define MAX_RDS_PTY			31
165 #define MAX_RDS_DEVIATION		90000
166 
167 /*
168  * PSNAME is known to be defined as 8 character sized (RDS Spec).
169  * However, there is receivers which scroll PSNAME 8xN sized.
170  */
171 #define MAX_RDS_PS_NAME			96
172 
173 /*
174  * MAX_RDS_RADIO_TEXT is known to be defined as 32 (2A group) or 64 (2B group)
175  * character sized (RDS Spec).
176  * However, there is receivers which scroll them as well.
177  */
178 #define MAX_RDS_RADIO_TEXT		384
179 
180 #define MAX_LIMITER_RELEASE_TIME	102390
181 #define MAX_LIMITER_DEVIATION		90000
182 
183 #define MAX_PILOT_DEVIATION		90000
184 #define MAX_PILOT_FREQUENCY		19000
185 
186 #define MAX_ACOMP_RELEASE_TIME		1000000
187 #define MAX_ACOMP_ATTACK_TIME		5000
188 #define MAX_ACOMP_THRESHOLD		0
189 #define MIN_ACOMP_THRESHOLD		(-40)
190 #define MAX_ACOMP_GAIN			20
191 
192 #define SI4713_NUM_SUPPLIES		2
193 
194 /*
195  * si4713_device - private data
196  */
197 struct si4713_device {
198 	/* v4l2_subdev and i2c reference (v4l2_subdev priv data) */
199 	struct v4l2_subdev sd;
200 	struct v4l2_ctrl_handler ctrl_handler;
201 	/* private data structures */
202 	struct { /* si4713 control cluster */
203 		/* This is one big cluster since the mute control
204 		 * powers off the device and after unmuting again all
205 		 * controls need to be set at once. The only way of doing
206 		 * that is by making it one big cluster. */
207 		struct v4l2_ctrl *mute;
208 		struct v4l2_ctrl *rds_ps_name;
209 		struct v4l2_ctrl *rds_radio_text;
210 		struct v4l2_ctrl *rds_pi;
211 		struct v4l2_ctrl *rds_deviation;
212 		struct v4l2_ctrl *rds_pty;
213 		struct v4l2_ctrl *compression_enabled;
214 		struct v4l2_ctrl *compression_threshold;
215 		struct v4l2_ctrl *compression_gain;
216 		struct v4l2_ctrl *compression_attack_time;
217 		struct v4l2_ctrl *compression_release_time;
218 		struct v4l2_ctrl *pilot_tone_enabled;
219 		struct v4l2_ctrl *pilot_tone_freq;
220 		struct v4l2_ctrl *pilot_tone_deviation;
221 		struct v4l2_ctrl *limiter_enabled;
222 		struct v4l2_ctrl *limiter_deviation;
223 		struct v4l2_ctrl *limiter_release_time;
224 		struct v4l2_ctrl *tune_preemphasis;
225 		struct v4l2_ctrl *tune_pwr_level;
226 		struct v4l2_ctrl *tune_ant_cap;
227 	};
228 	struct completion work;
229 	struct regulator_bulk_data supplies[SI4713_NUM_SUPPLIES];
230 	int gpio_reset;
231 	u32 power_state;
232 	u32 rds_enabled;
233 	u32 frequency;
234 	u32 preemphasis;
235 	u32 stereo;
236 	u32 tune_rnl;
237 };
238 #endif /* ifndef SI4713_I2C_H */
239