8 hack.h - hackish code that needs to be improved (or removed) at a
11 Copyright (C) 2007 Michel Ludwig <michel.ludwig@gmail.com>
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation version 2
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <linux/usb.h>
33 static inline int tm6000_snd_control_msg(struct tm6000_core
*dev
, __u8 request
, __u16 value
, __u16 index
, void *data
, __u16 size
)
35 return tm6000_read_write_usb (dev
, USB_DIR_OUT
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
, request
, value
, index
, data
, size
);
38 static int pseudo_zl10353_pll(struct tm6000_core
*tm6000_dev
, struct dvb_frontend_parameters
*p
)
41 u8
*data
= kzalloc(50*sizeof(u8
), GFP_KERNEL
);
43 printk(KERN_ALERT
"should set frequency %u\n", p
->frequency
);
44 printk(KERN_ALERT
"and bandwith %u\n", p
->u
.ofdm
.bandwidth
);
46 if(tm6000_dev
->dvb
->frontend
->ops
.tuner_ops
.set_params
) {
47 tm6000_dev
->dvb
->frontend
->ops
.tuner_ops
.set_params(tm6000_dev
->dvb
->frontend
, p
);
50 printk(KERN_ALERT
"pseudo zl10353: couldn't set tuner parameters\n");
55 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x501e, 0x00, data
, 0x1);
58 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x551e, 0x00, data
, 0x1);
61 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0xea1e, 0x00, data
, 0x1);
64 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0xea1e, 0x00, data
, 0x1);
67 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x561e, 0x00, data
, 0x1);
70 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x5e1e, 0x00, data
, 0x1);
73 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x641e, 0x00, data
, 0x1);
76 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x651e, 0x00, data
, 0x1);
79 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x661e, 0x00, data
, 0x1);
82 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x6c1e, 0x00, data
, 0x1);
85 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x6d1e, 0x00, data
, 0x1);
88 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x511e, 0x00, data
, 0x1);
91 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x521e, 0x00, data
, 0x1);
94 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x531e, 0x00, data
, 0x1);
97 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x541e, 0x00, data
, 0x1);
100 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x5c1e, 0x00, data
, 0x1);
103 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x701e, 0x00, data
, 0x1);
106 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x701e, 0x00, data
, 0x1);
111 switch(p
->u
.ofdm
.bandwidth
) {
112 case BANDWIDTH_8_MHZ
:
114 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x701e, 0x00, data
, 0x1);
117 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x641e, 0x00, data
, 0x1);
120 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x651e, 0x00, data
, 0x1);
123 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x661e, 0x00, data
, 0x1);
126 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x6c1e, 0x00, data
, 0x1);
129 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x6d1e, 0x00, data
, 0x1);
132 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x511e, 0x00, data
, 0x1);
135 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x521e, 0x00, data
, 0x1);
138 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x531e, 0x00, data
, 0x1);
141 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x541e, 0x00, data
, 0x1);
144 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x5c1e, 0x00, data
, 0x1);
147 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x701e, 0x00, data
, 0x1);
152 printk(KERN_ALERT
"tm6000: bandwidth not supported\n");
153 case BANDWIDTH_7_MHZ
:
155 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x701e, 0x00, data
, 0x1);
158 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x641e, 0x00, data
, 0x1);
161 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x651e, 0x00, data
, 0x1);
164 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x661e, 0x00, data
, 0x1);
167 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x6c1e, 0x00, data
, 0x1);
170 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x6d1e, 0x00, data
, 0x1);
173 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x511e, 0x00, data
, 0x1);
176 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x521e, 0x00, data
, 0x1);
179 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x531e, 0x00, data
, 0x1);
182 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x541e, 0x00, data
, 0x1);
185 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x5c1e, 0x00, data
, 0x1);
188 ret
= tm6000_snd_control_msg(tm6000_dev
, 0x10, 0x701e, 0x00, data
, 0x1);
200 int pseudo_zl10353_set_frontend(struct dvb_frontend
*fe
,
201 struct dvb_frontend_parameters
*p
)
203 struct tm6000_core
*tm6000_dev
= fe
->dvb
->priv
;
207 // mutex_lock(&tm6000_dev->mutex);
208 pseudo_zl10353_pll(tm6000_dev
, p
);
209 // mutex_unlock(&tm6000_dev->mutex);
212 if(tm6000_dev
->dvb
->frontend
->ops
.read_status
) {
213 tm6000_dev
->dvb
->frontend
->ops
.read_status(tm6000_dev
->dvb
->frontend
, &status
);
214 printk(KERN_ALERT
"demodulator status: FE_HAS_CARRIER %i \n", (status
& FE_HAS_CARRIER
));
215 printk(KERN_ALERT
"demodulator status: FE_HAS_VITERBI %i \n", (status
& FE_HAS_VITERBI
));
216 printk(KERN_ALERT
"demodulator status: FE_HAS_LOCK %i \n", (status
& FE_HAS_LOCK
));
217 printk(KERN_ALERT
"demodulator status: FE_HAS_SYNC %i \n", (status
& FE_HAS_SYNC
));
218 printk(KERN_ALERT
"demodulator status: FE_HAS_SIGNAL %i \n", (status
& FE_HAS_SIGNAL
));
221 printk(KERN_ALERT
"pseudo zl10353: couldn't read demodulator status\n");
226 int pseudo_zl10353_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
229 *status
= FE_HAS_CARRIER
| FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
| FE_HAS_SIGNAL
;
234 struct dvb_frontend
* pseudo_zl10353_attach(struct tm6000_core
*dev
,
235 const struct zl10353_config
*config
,
236 struct i2c_adapter
*i2c
)
238 struct tm6000_dvb
*dvb
= dev
->dvb
;
240 dvb
->frontend
= dvb_attach(zl10353_attach
, config
, i2c
);
242 printk(KERN_ERR
"Error during zl10353_attach!\n");
246 /* override some functions with our implementations */
247 dvb
->frontend
->ops
.set_frontend
= pseudo_zl10353_set_frontend
;
248 dvb
->frontend
->ops
.read_status
= pseudo_zl10353_read_status
;
249 dvb
->frontend
->frontend_priv
= dev
;
251 return dvb
->frontend
;