]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/media/dvb-core/dvb_frontend.h
[media] Docbook: Document struct analog_parameters
[karo-tx-linux.git] / drivers / media / dvb-core / dvb_frontend.h
1 /*
2  * dvb_frontend.h
3  *
4  * Copyright (C) 2001 convergence integrated media GmbH
5  * Copyright (C) 2004 convergence GmbH
6  *
7  * Written by Ralph Metzler
8  * Overhauled by Holger Waechtler
9  * Kernel I2C stuff by Michael Hunold <hunold@convergence.de>
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21
22  * You should have received a copy of the GNU Lesser General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25  *
26  */
27
28 #ifndef _DVB_FRONTEND_H_
29 #define _DVB_FRONTEND_H_
30
31 #include <linux/types.h>
32 #include <linux/sched.h>
33 #include <linux/ioctl.h>
34 #include <linux/i2c.h>
35 #include <linux/module.h>
36 #include <linux/errno.h>
37 #include <linux/delay.h>
38 #include <linux/mutex.h>
39 #include <linux/slab.h>
40
41 #include <linux/dvb/frontend.h>
42
43 #include "dvbdev.h"
44
45 /*
46  * Maximum number of Delivery systems per frontend. It
47  * should be smaller or equal to 32
48  */
49 #define MAX_DELSYS      8
50
51 /**
52  * struct dvb_frontend_tune_settings - parameters to adjust frontend tuning
53  *
54  * @min_delay_ms:       minimum delay for tuning, in ms
55  * @step_size:          step size between two consecutive frequencies
56  * @max_drift:          maximum drift
57  *
58  * NOTE: step_size is in Hz, for terrestrial/cable or kHz for satellite
59  */
60 struct dvb_frontend_tune_settings {
61         int min_delay_ms;
62         int step_size;
63         int max_drift;
64 };
65
66 struct dvb_frontend;
67
68 /**
69  * struct dvb_tuner_info - Frontend name and min/max ranges/bandwidths
70  *
71  * @name:               name of the Frontend
72  * @frequency_min:      minimal frequency supported
73  * @frequency_max:      maximum frequency supported
74  * @frequency_step:     frequency step
75  * @bandwidth_min:      minimal frontend bandwidth supported
76  * @bandwidth_max:      maximum frontend bandwidth supported
77  * @bandwidth_step:     frontend bandwidth step
78  *
79  * NOTE: frequency parameters are in Hz, for terrestrial/cable or kHz for
80  * satellite.
81  */
82 struct dvb_tuner_info {
83         char name[128];
84
85         u32 frequency_min;
86         u32 frequency_max;
87         u32 frequency_step;
88
89         u32 bandwidth_min;
90         u32 bandwidth_max;
91         u32 bandwidth_step;
92 };
93
94 /**
95  * struct analog_parameters - Parameters to tune into an analog/radio channel
96  *
97  * @frequency:  Frequency used by analog TV tuner (either in 62.5 kHz step,
98  *              for TV, or 62.5 Hz for radio)
99  * @mode:       Tuner mode, as defined on enum v4l2_tuner_type
100  * @audmode:    Audio mode as defined for the rxsubchans field at videodev2.h,
101  *              e. g. V4L2_TUNER_MODE_*
102  * @std:        TV standard bitmap as defined at videodev2.h, e. g. V4L2_STD_*
103  *
104  * Hybrid tuners should be supported by both V4L2 and DVB APIs. This
105  * struct contains the data that are used by the V4L2 side. To avoid
106  * dependencies from V4L2 headers, all enums here are declared as integers.
107  */
108 struct analog_parameters {
109         unsigned int frequency;
110         unsigned int mode;
111         unsigned int audmode;
112         u64 std;
113 };
114
115 enum tuner_param {
116         DVBFE_TUNER_FREQUENCY           = (1 <<  0),
117         DVBFE_TUNER_TUNERSTEP           = (1 <<  1),
118         DVBFE_TUNER_IFFREQ              = (1 <<  2),
119         DVBFE_TUNER_BANDWIDTH           = (1 <<  3),
120         DVBFE_TUNER_REFCLOCK            = (1 <<  4),
121         DVBFE_TUNER_IQSENSE             = (1 <<  5),
122         DVBFE_TUNER_DUMMY               = (1 << 31)
123 };
124
125 /**
126  * enum dvbfe_algo - defines the algorithm used to tune into a channel
127  *
128  * @DVBFE_ALGO_HW: Hardware Algorithm -
129  *      Devices that support this algorithm do everything in hardware
130  *      and no software support is needed to handle them.
131  *      Requesting these devices to LOCK is the only thing required,
132  *      device is supposed to do everything in the hardware.
133  *
134  * @DVBFE_ALGO_SW: Software Algorithm -
135  * These are dumb devices, that require software to do everything
136  *
137  * @DVBFE_ALGO_CUSTOM: Customizable Agorithm -
138  *      Devices having this algorithm can be customized to have specific
139  *      algorithms in the frontend driver, rather than simply doing a
140  *      software zig-zag. In this case the zigzag maybe hardware assisted
141  *      or it maybe completely done in hardware. In all cases, usage of
142  *      this algorithm, in conjunction with the search and track
143  *      callbacks, utilizes the driver specific algorithm.
144  *
145  * @DVBFE_ALGO_RECOVERY: Recovery Algorithm -
146  *      These devices have AUTO recovery capabilities from LOCK failure
147  */
148 enum dvbfe_algo {
149         DVBFE_ALGO_HW                   = (1 <<  0),
150         DVBFE_ALGO_SW                   = (1 <<  1),
151         DVBFE_ALGO_CUSTOM               = (1 <<  2),
152         DVBFE_ALGO_RECOVERY             = (1 << 31)
153 };
154
155 struct tuner_state {
156         u32 frequency;
157         u32 tunerstep;
158         u32 ifreq;
159         u32 bandwidth;
160         u32 iqsense;
161         u32 refclock;
162 };
163
164 /**
165  * enum dvbfe_search - search callback possible return status
166  *
167  * @DVBFE_ALGO_SEARCH_SUCCESS:
168  *      The frontend search algorithm completed and returned successfully
169  *
170  * @DVBFE_ALGO_SEARCH_ASLEEP:
171  *      The frontend search algorithm is sleeping
172  *
173  * @DVBFE_ALGO_SEARCH_FAILED:
174  *      The frontend search for a signal failed
175  *
176  * @DVBFE_ALGO_SEARCH_INVALID:
177  *      The frontend search algorith was probably supplied with invalid
178  *      parameters and the search is an invalid one
179  *
180  * @DVBFE_ALGO_SEARCH_ERROR:
181  *      The frontend search algorithm failed due to some error
182  *
183  * @DVBFE_ALGO_SEARCH_AGAIN:
184  *      The frontend search algorithm was requested to search again
185  */
186 enum dvbfe_search {
187         DVBFE_ALGO_SEARCH_SUCCESS       = (1 <<  0),
188         DVBFE_ALGO_SEARCH_ASLEEP        = (1 <<  1),
189         DVBFE_ALGO_SEARCH_FAILED        = (1 <<  2),
190         DVBFE_ALGO_SEARCH_INVALID       = (1 <<  3),
191         DVBFE_ALGO_SEARCH_AGAIN         = (1 <<  4),
192         DVBFE_ALGO_SEARCH_ERROR         = (1 << 31),
193 };
194
195
196 struct dvb_tuner_ops {
197
198         struct dvb_tuner_info info;
199
200         int (*release)(struct dvb_frontend *fe);
201         int (*init)(struct dvb_frontend *fe);
202         int (*sleep)(struct dvb_frontend *fe);
203         int (*suspend)(struct dvb_frontend *fe);
204         int (*resume)(struct dvb_frontend *fe);
205
206         /** This is for simple PLLs - set all parameters in one go. */
207         int (*set_params)(struct dvb_frontend *fe);
208         int (*set_analog_params)(struct dvb_frontend *fe, struct analog_parameters *p);
209
210         /** This is support for demods like the mt352 - fills out the supplied buffer with what to write. */
211         int (*calc_regs)(struct dvb_frontend *fe, u8 *buf, int buf_len);
212
213         /** This is to allow setting tuner-specific configs */
214         int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
215
216         int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency);
217         int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);
218         int (*get_if_frequency)(struct dvb_frontend *fe, u32 *frequency);
219
220 #define TUNER_STATUS_LOCKED 1
221 #define TUNER_STATUS_STEREO 2
222         int (*get_status)(struct dvb_frontend *fe, u32 *status);
223         int (*get_rf_strength)(struct dvb_frontend *fe, u16 *strength);
224         int (*get_afc)(struct dvb_frontend *fe, s32 *afc);
225
226         /** These are provided separately from set_params in order to facilitate silicon
227          * tuners which require sophisticated tuning loops, controlling each parameter separately. */
228         int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
229         int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
230
231         /*
232          * These are provided separately from set_params in order to facilitate silicon
233          * tuners which require sophisticated tuning loops, controlling each parameter separately.
234          */
235         int (*set_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
236         int (*get_state)(struct dvb_frontend *fe, enum tuner_param param, struct tuner_state *state);
237 };
238
239 struct analog_demod_info {
240         char *name;
241 };
242
243 struct analog_demod_ops {
244
245         struct analog_demod_info info;
246
247         void (*set_params)(struct dvb_frontend *fe,
248                            struct analog_parameters *params);
249         int  (*has_signal)(struct dvb_frontend *fe, u16 *signal);
250         int  (*get_afc)(struct dvb_frontend *fe, s32 *afc);
251         void (*tuner_status)(struct dvb_frontend *fe);
252         void (*standby)(struct dvb_frontend *fe);
253         void (*release)(struct dvb_frontend *fe);
254         int  (*i2c_gate_ctrl)(struct dvb_frontend *fe, int enable);
255
256         /** This is to allow setting tuner-specific configuration */
257         int (*set_config)(struct dvb_frontend *fe, void *priv_cfg);
258 };
259
260 struct dtv_frontend_properties;
261
262 struct dvb_frontend_ops {
263
264         struct dvb_frontend_info info;
265
266         u8 delsys[MAX_DELSYS];
267
268         void (*release)(struct dvb_frontend* fe);
269         void (*release_sec)(struct dvb_frontend* fe);
270
271         int (*init)(struct dvb_frontend* fe);
272         int (*sleep)(struct dvb_frontend* fe);
273
274         int (*write)(struct dvb_frontend* fe, const u8 buf[], int len);
275
276         /* if this is set, it overrides the default swzigzag */
277         int (*tune)(struct dvb_frontend* fe,
278                     bool re_tune,
279                     unsigned int mode_flags,
280                     unsigned int *delay,
281                     enum fe_status *status);
282         /* get frontend tuning algorithm from the module */
283         enum dvbfe_algo (*get_frontend_algo)(struct dvb_frontend *fe);
284
285         /* these two are only used for the swzigzag code */
286         int (*set_frontend)(struct dvb_frontend *fe);
287         int (*get_tune_settings)(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* settings);
288
289         int (*get_frontend)(struct dvb_frontend *fe);
290
291         int (*read_status)(struct dvb_frontend *fe, enum fe_status *status);
292         int (*read_ber)(struct dvb_frontend* fe, u32* ber);
293         int (*read_signal_strength)(struct dvb_frontend* fe, u16* strength);
294         int (*read_snr)(struct dvb_frontend* fe, u16* snr);
295         int (*read_ucblocks)(struct dvb_frontend* fe, u32* ucblocks);
296
297         int (*diseqc_reset_overload)(struct dvb_frontend* fe);
298         int (*diseqc_send_master_cmd)(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd);
299         int (*diseqc_recv_slave_reply)(struct dvb_frontend* fe, struct dvb_diseqc_slave_reply* reply);
300         int (*diseqc_send_burst)(struct dvb_frontend *fe,
301                                  enum fe_sec_mini_cmd minicmd);
302         int (*set_tone)(struct dvb_frontend *fe, enum fe_sec_tone_mode tone);
303         int (*set_voltage)(struct dvb_frontend *fe,
304                            enum fe_sec_voltage voltage);
305         int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
306         int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
307         int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
308         int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire);
309         int (*set_lna)(struct dvb_frontend *);
310
311         /* These callbacks are for devices that implement their own
312          * tuning algorithms, rather than a simple swzigzag
313          */
314         enum dvbfe_search (*search)(struct dvb_frontend *fe);
315
316         struct dvb_tuner_ops tuner_ops;
317         struct analog_demod_ops analog_ops;
318
319         int (*set_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
320         int (*get_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
321 };
322
323 #ifdef __DVB_CORE__
324 #define MAX_EVENT 8
325
326 struct dvb_fe_events {
327         struct dvb_frontend_event events[MAX_EVENT];
328         int                       eventw;
329         int                       eventr;
330         int                       overflow;
331         wait_queue_head_t         wait_queue;
332         struct mutex              mtx;
333 };
334 #endif
335
336 struct dtv_frontend_properties {
337
338         /* Cache State */
339         u32                     state;
340
341         u32                     frequency;
342         enum fe_modulation              modulation;
343
344         enum fe_sec_voltage     voltage;
345         enum fe_sec_tone_mode   sectone;
346         enum fe_spectral_inversion      inversion;
347         enum fe_code_rate               fec_inner;
348         enum fe_transmit_mode   transmission_mode;
349         u32                     bandwidth_hz;   /* 0 = AUTO */
350         enum fe_guard_interval  guard_interval;
351         enum fe_hierarchy               hierarchy;
352         u32                     symbol_rate;
353         enum fe_code_rate               code_rate_HP;
354         enum fe_code_rate               code_rate_LP;
355
356         enum fe_pilot           pilot;
357         enum fe_rolloff         rolloff;
358
359         enum fe_delivery_system delivery_system;
360
361         enum fe_interleaving    interleaving;
362
363         /* ISDB-T specifics */
364         u8                      isdbt_partial_reception;
365         u8                      isdbt_sb_mode;
366         u8                      isdbt_sb_subchannel;
367         u32                     isdbt_sb_segment_idx;
368         u32                     isdbt_sb_segment_count;
369         u8                      isdbt_layer_enabled;
370         struct {
371             u8                  segment_count;
372             enum fe_code_rate   fec;
373             enum fe_modulation  modulation;
374             u8                  interleaving;
375         } layer[3];
376
377         /* Multistream specifics */
378         u32                     stream_id;
379
380         /* ATSC-MH specifics */
381         u8                      atscmh_fic_ver;
382         u8                      atscmh_parade_id;
383         u8                      atscmh_nog;
384         u8                      atscmh_tnog;
385         u8                      atscmh_sgn;
386         u8                      atscmh_prc;
387
388         u8                      atscmh_rs_frame_mode;
389         u8                      atscmh_rs_frame_ensemble;
390         u8                      atscmh_rs_code_mode_pri;
391         u8                      atscmh_rs_code_mode_sec;
392         u8                      atscmh_sccc_block_mode;
393         u8                      atscmh_sccc_code_mode_a;
394         u8                      atscmh_sccc_code_mode_b;
395         u8                      atscmh_sccc_code_mode_c;
396         u8                      atscmh_sccc_code_mode_d;
397
398         u32                     lna;
399
400         /* statistics data */
401         struct dtv_fe_stats     strength;
402         struct dtv_fe_stats     cnr;
403         struct dtv_fe_stats     pre_bit_error;
404         struct dtv_fe_stats     pre_bit_count;
405         struct dtv_fe_stats     post_bit_error;
406         struct dtv_fe_stats     post_bit_count;
407         struct dtv_fe_stats     block_error;
408         struct dtv_fe_stats     block_count;
409 };
410
411 #define DVB_FE_NO_EXIT  0
412 #define DVB_FE_NORMAL_EXIT      1
413 #define DVB_FE_DEVICE_REMOVED   2
414 #define DVB_FE_DEVICE_RESUME    3
415
416 struct dvb_frontend {
417         struct dvb_frontend_ops ops;
418         struct dvb_adapter *dvb;
419         void *demodulator_priv;
420         void *tuner_priv;
421         void *frontend_priv;
422         void *sec_priv;
423         void *analog_demod_priv;
424         struct dtv_frontend_properties dtv_property_cache;
425 #define DVB_FRONTEND_COMPONENT_TUNER 0
426 #define DVB_FRONTEND_COMPONENT_DEMOD 1
427         int (*callback)(void *adapter_priv, int component, int cmd, int arg);
428         int id;
429         unsigned int exit;
430 };
431
432 extern int dvb_register_frontend(struct dvb_adapter *dvb,
433                                  struct dvb_frontend *fe);
434
435 extern int dvb_unregister_frontend(struct dvb_frontend *fe);
436
437 extern void dvb_frontend_detach(struct dvb_frontend *fe);
438
439 extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
440 extern int dvb_frontend_suspend(struct dvb_frontend *fe);
441 extern int dvb_frontend_resume(struct dvb_frontend *fe);
442
443 extern void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec);
444
445 #endif