On Tue, Nov 06, 2007 at 02:33:53AM -0800, akpm@linux-foundation.org wrote:
[mmotm.git] / drivers / staging / tm6000 / hack.c
blobf181fce6716b84189d5453a5c97bcf6a5ed53b1b
7 /*
8 hack.h - hackish code that needs to be improved (or removed) at a
9 later point
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.
27 #include "hack.h"
29 #include "tm6000.h"
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)
40 int ret;
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);
49 else {
50 printk(KERN_ALERT "pseudo zl10353: couldn't set tuner parameters\n");
53 // init ZL10353
54 data[0] = 0x0b;
55 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x501e, 0x00, data, 0x1);
56 msleep(15);
57 data[0] = 0x80;
58 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x551e, 0x00, data, 0x1);
59 msleep(100);
60 data[0] = 0x01;
61 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0xea1e, 0x00, data, 0x1);
62 msleep(100);
63 data[0] = 0x00;
64 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0xea1e, 0x00, data, 0x1);
65 msleep(15);
66 data[0] = 0x1c;
67 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x561e, 0x00, data, 0x1);
68 msleep(15);
69 data[0] = 0x40;
70 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x5e1e, 0x00, data, 0x1);
71 msleep(15);
72 data[0] = 0x36;
73 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x641e, 0x00, data, 0x1);
74 msleep(15);
75 data[0] = 0x67;
76 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x651e, 0x00, data, 0x1);
77 msleep(15);
78 data[0] = 0xe5;
79 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x661e, 0x00, data, 0x1);
80 msleep(15);
81 data[0] = 0x19;
82 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x6c1e, 0x00, data, 0x1);
83 msleep(15);
84 data[0] = 0xe9;
85 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x6d1e, 0x00, data, 0x1);
86 msleep(15);
87 data[0] = 0x44;
88 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x511e, 0x00, data, 0x1);
89 msleep(15);
90 data[0] = 0x46;
91 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x521e, 0x00, data, 0x1);
92 msleep(15);
93 data[0] = 0x15;
94 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x531e, 0x00, data, 0x1);
95 msleep(15);
96 data[0] = 0x0f;
97 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x541e, 0x00, data, 0x1);
98 msleep(15);
99 data[0] = 0x75;
100 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x5c1e, 0x00, data, 0x1);
101 msleep(15);
102 data[0] = 0x01;
103 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x701e, 0x00, data, 0x1);
104 msleep(15);
105 data[0] = 0x00;
106 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x701e, 0x00, data, 0x1);
107 msleep(15);
109 msleep(50);
111 switch(p->u.ofdm.bandwidth) {
112 case BANDWIDTH_8_MHZ:
113 data[0] = 0x00;
114 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x701e, 0x00, data, 0x1);
115 msleep(15);
116 data[0] = 0x36;
117 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x641e, 0x00, data, 0x1);
118 msleep(15);
119 data[0] = 0x67;
120 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x651e, 0x00, data, 0x1);
121 msleep(15);
122 data[0] = 0xe5;
123 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x661e, 0x00, data, 0x1);
124 msleep(15);
125 data[0] = 0x19;
126 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x6c1e, 0x00, data, 0x1);
127 msleep(15);
128 data[0] = 0xe9;
129 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x6d1e, 0x00, data, 0x1);
130 msleep(15);
131 data[0] = 0x44;
132 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x511e, 0x00, data, 0x1);
133 msleep(15);
134 data[0] = 0x46;
135 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x521e, 0x00, data, 0x1);
136 msleep(15);
137 data[0] = 0x15;
138 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x531e, 0x00, data, 0x1);
139 msleep(15);
140 data[0] = 0x0f;
141 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x541e, 0x00, data, 0x1);
142 msleep(15);
143 data[0] = 0x75;
144 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x5c1e, 0x00, data, 0x1);
145 msleep(15);
146 data[0] = 0x01;
147 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x701e, 0x00, data, 0x1);
148 msleep(15);
149 break;
151 default:
152 printk(KERN_ALERT "tm6000: bandwidth not supported\n");
153 case BANDWIDTH_7_MHZ:
154 data[0] = 0x00;
155 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x701e, 0x00, data, 0x1);
156 msleep(15);
157 data[0] = 0x35;
158 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x641e, 0x00, data, 0x1);
159 msleep(15);
160 data[0] = 0x5a;
161 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x651e, 0x00, data, 0x1);
162 msleep(15);
163 data[0] = 0xe9;
164 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x661e, 0x00, data, 0x1);
165 msleep(15);
166 data[0] = 0x19;
167 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x6c1e, 0x00, data, 0x1);
168 msleep(15);
169 data[0] = 0xe9;
170 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x6d1e, 0x00, data, 0x1);
171 msleep(15);
172 data[0] = 0x44;
173 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x511e, 0x00, data, 0x1);
174 msleep(15);
175 data[0] = 0x46;
176 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x521e, 0x00, data, 0x1);
177 msleep(15);
178 data[0] = 0x15;
179 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x531e, 0x00, data, 0x1);
180 msleep(15);
181 data[0] = 0x0f;
182 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x541e, 0x00, data, 0x1);
183 msleep(15);
184 data[0] = 0x86;
185 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x5c1e, 0x00, data, 0x1);
186 msleep(15);
187 data[0] = 0x01;
188 ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x701e, 0x00, data, 0x1);
189 msleep(15);
190 break;
193 kfree(data);
195 return 0;
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;
204 u32 status;
206 if(p != NULL) {
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));
220 else {
221 printk(KERN_ALERT "pseudo zl10353: couldn't read demodulator status\n");
223 return 0;
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;
231 return 0;
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);
241 if(!dvb->frontend) {
242 printk(KERN_ERR "Error during zl10353_attach!\n");
243 return NULL;
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;