Merge branch 'perf/urgent' into perf/core, to pick up fixes
[linux-2.6-microblaze.git] / drivers / media / dvb-frontends / or51211.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *    Support for OR51211 (pcHDTV HD-2000) - VSB
4  *
5  *    Copyright (C) 2005 Kirk Lapray <kirk_lapray@bigfoot.com>
6  *
7  *    Based on code from Jack Kelliher (kelliher@xmission.com)
8  *                           Copyright (C) 2002 & pcHDTV, inc.
9 */
10
11 #define pr_fmt(fmt)     KBUILD_MODNAME ": %s: " fmt, __func__
12
13 /*
14  * This driver needs external firmware. Please use the command
15  * "<kerneldir>/scripts/get_dvb_firmware or51211" to
16  * download/extract it, and then copy it to /usr/lib/hotplug/firmware
17  * or /lib/firmware (depending on configuration of firmware hotplug).
18  */
19 #define OR51211_DEFAULT_FIRMWARE "dvb-fe-or51211.fw"
20
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/device.h>
24 #include <linux/firmware.h>
25 #include <linux/string.h>
26 #include <linux/slab.h>
27 #include <asm/byteorder.h>
28
29 #include <media/dvb_math.h>
30 #include <media/dvb_frontend.h>
31 #include "or51211.h"
32
33 static int debug;
34 #define dprintk(args...) \
35         do { if (debug) pr_debug(args); } while (0)
36
37 static u8 run_buf[] = {0x7f,0x01};
38 static u8 cmd_buf[] = {0x04,0x01,0x50,0x80,0x06}; // ATSC
39
40 struct or51211_state {
41
42         struct i2c_adapter* i2c;
43
44         /* Configuration settings */
45         const struct or51211_config* config;
46
47         struct dvb_frontend frontend;
48         struct bt878* bt;
49
50         /* Demodulator private data */
51         u8 initialized:1;
52         u32 snr; /* Result of last SNR calculation */
53
54         /* Tuner private data */
55         u32 current_frequency;
56 };
57
58 static int i2c_writebytes (struct or51211_state* state, u8 reg, const u8 *buf,
59                            int len)
60 {
61         int err;
62         struct i2c_msg msg;
63         msg.addr        = reg;
64         msg.flags       = 0;
65         msg.len         = len;
66         msg.buf         = (u8 *)buf;
67
68         if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
69                 pr_warn("error (addr %02x, err == %i)\n", reg, err);
70                 return -EREMOTEIO;
71         }
72
73         return 0;
74 }
75
76 static int i2c_readbytes(struct or51211_state *state, u8 reg, u8 *buf, int len)
77 {
78         int err;
79         struct i2c_msg msg;
80         msg.addr        = reg;
81         msg.flags       = I2C_M_RD;
82         msg.len         = len;
83         msg.buf         = buf;
84
85         if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
86                 pr_warn("error (addr %02x, err == %i)\n", reg, err);
87                 return -EREMOTEIO;
88         }
89
90         return 0;
91 }
92
93 static int or51211_load_firmware (struct dvb_frontend* fe,
94                                   const struct firmware *fw)
95 {
96         struct or51211_state* state = fe->demodulator_priv;
97         u8 tudata[585];
98         int i;
99
100         dprintk("Firmware is %zu bytes\n", fw->size);
101
102         /* Get eprom data */
103         tudata[0] = 17;
104         if (i2c_writebytes(state,0x50,tudata,1)) {
105                 pr_warn("error eprom addr\n");
106                 return -1;
107         }
108         if (i2c_readbytes(state,0x50,&tudata[145],192)) {
109                 pr_warn("error eprom\n");
110                 return -1;
111         }
112
113         /* Create firmware buffer */
114         for (i = 0; i < 145; i++)
115                 tudata[i] = fw->data[i];
116
117         for (i = 0; i < 248; i++)
118                 tudata[i+337] = fw->data[145+i];
119
120         state->config->reset(fe);
121
122         if (i2c_writebytes(state,state->config->demod_address,tudata,585)) {
123                 pr_warn("error 1\n");
124                 return -1;
125         }
126         msleep(1);
127
128         if (i2c_writebytes(state,state->config->demod_address,
129                            &fw->data[393],8125)) {
130                 pr_warn("error 2\n");
131                 return -1;
132         }
133         msleep(1);
134
135         if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
136                 pr_warn("error 3\n");
137                 return -1;
138         }
139
140         /* Wait at least 5 msec */
141         msleep(10);
142         if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
143                 pr_warn("error 4\n");
144                 return -1;
145         }
146         msleep(10);
147
148         pr_info("Done.\n");
149         return 0;
150 };
151
152 static int or51211_setmode(struct dvb_frontend* fe, int mode)
153 {
154         struct or51211_state* state = fe->demodulator_priv;
155         u8 rec_buf[14];
156
157         state->config->setmode(fe, mode);
158
159         if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
160                 pr_warn("error 1\n");
161                 return -1;
162         }
163
164         /* Wait at least 5 msec */
165         msleep(10);
166         if (i2c_writebytes(state,state->config->demod_address,run_buf,2)) {
167                 pr_warn("error 2\n");
168                 return -1;
169         }
170
171         msleep(10);
172
173         /* Set operation mode in Receiver 1 register;
174          * type 1:
175          * data 0x50h  Automatic sets receiver channel conditions
176          *             Automatic NTSC rejection filter
177          *             Enable  MPEG serial data output
178          *             MPEG2tr
179          *             High tuner phase noise
180          *             normal +/-150kHz Carrier acquisition range
181          */
182         if (i2c_writebytes(state,state->config->demod_address,cmd_buf,3)) {
183                 pr_warn("error 3\n");
184                 return -1;
185         }
186
187         rec_buf[0] = 0x04;
188         rec_buf[1] = 0x00;
189         rec_buf[2] = 0x03;
190         rec_buf[3] = 0x00;
191         msleep(20);
192         if (i2c_writebytes(state,state->config->demod_address,rec_buf,3)) {
193                 pr_warn("error 5\n");
194         }
195         msleep(3);
196         if (i2c_readbytes(state,state->config->demod_address,&rec_buf[10],2)) {
197                 pr_warn("error 6\n");
198                 return -1;
199         }
200         dprintk("rec status %02x %02x\n", rec_buf[10], rec_buf[11]);
201
202         return 0;
203 }
204
205 static int or51211_set_parameters(struct dvb_frontend *fe)
206 {
207         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
208         struct or51211_state* state = fe->demodulator_priv;
209
210         /* Change only if we are actually changing the channel */
211         if (state->current_frequency != p->frequency) {
212                 if (fe->ops.tuner_ops.set_params) {
213                         fe->ops.tuner_ops.set_params(fe);
214                         if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
215                 }
216
217                 /* Set to ATSC mode */
218                 or51211_setmode(fe,0);
219
220                 /* Update current frequency */
221                 state->current_frequency = p->frequency;
222         }
223         return 0;
224 }
225
226 static int or51211_read_status(struct dvb_frontend *fe, enum fe_status *status)
227 {
228         struct or51211_state* state = fe->demodulator_priv;
229         unsigned char rec_buf[2];
230         unsigned char snd_buf[] = {0x04,0x00,0x03,0x00};
231         *status = 0;
232
233         /* Receiver Status */
234         if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
235                 pr_warn("write error\n");
236                 return -1;
237         }
238         msleep(3);
239         if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
240                 pr_warn("read error\n");
241                 return -1;
242         }
243         dprintk("%x %x\n", rec_buf[0], rec_buf[1]);
244
245         if (rec_buf[0] &  0x01) { /* Receiver Lock */
246                 *status |= FE_HAS_SIGNAL;
247                 *status |= FE_HAS_CARRIER;
248                 *status |= FE_HAS_VITERBI;
249                 *status |= FE_HAS_SYNC;
250                 *status |= FE_HAS_LOCK;
251         }
252         return 0;
253 }
254
255 /* Calculate SNR estimation (scaled by 2^24)
256
257    8-VSB SNR equation from Oren datasheets
258
259    For 8-VSB:
260      SNR[dB] = 10 * log10(219037.9454 / MSE^2 )
261
262    We re-write the snr equation as:
263      SNR * 2^24 = 10*(c - 2*intlog10(MSE))
264    Where for 8-VSB, c = log10(219037.9454) * 2^24 */
265
266 static u32 calculate_snr(u32 mse, u32 c)
267 {
268         if (mse == 0) /* No signal */
269                 return 0;
270
271         mse = 2*intlog10(mse);
272         if (mse > c) {
273                 /* Negative SNR, which is possible, but realisticly the
274                 demod will lose lock before the signal gets this bad.  The
275                 API only allows for unsigned values, so just return 0 */
276                 return 0;
277         }
278         return 10*(c - mse);
279 }
280
281 static int or51211_read_snr(struct dvb_frontend* fe, u16* snr)
282 {
283         struct or51211_state* state = fe->demodulator_priv;
284         u8 rec_buf[2];
285         u8 snd_buf[3];
286
287         /* SNR after Equalizer */
288         snd_buf[0] = 0x04;
289         snd_buf[1] = 0x00;
290         snd_buf[2] = 0x04;
291
292         if (i2c_writebytes(state,state->config->demod_address,snd_buf,3)) {
293                 pr_warn("error writing snr reg\n");
294                 return -1;
295         }
296         if (i2c_readbytes(state,state->config->demod_address,rec_buf,2)) {
297                 pr_warn("read_status read error\n");
298                 return -1;
299         }
300
301         state->snr = calculate_snr(rec_buf[0], 89599047);
302         *snr = (state->snr) >> 16;
303
304         dprintk("noise = 0x%02x, snr = %d.%02d dB\n", rec_buf[0],
305                 state->snr >> 24, (((state->snr>>8) & 0xffff) * 100) >> 16);
306
307         return 0;
308 }
309
310 static int or51211_read_signal_strength(struct dvb_frontend* fe, u16* strength)
311 {
312         /* Calculate Strength from SNR up to 35dB */
313         /* Even though the SNR can go higher than 35dB, there is some comfort */
314         /* factor in having a range of strong signals that can show at 100%   */
315         struct or51211_state* state = (struct or51211_state*)fe->demodulator_priv;
316         u16 snr;
317         int ret;
318
319         ret = fe->ops.read_snr(fe, &snr);
320         if (ret != 0)
321                 return ret;
322         /* Rather than use the 8.8 value snr, use state->snr which is 8.24 */
323         /* scale the range 0 - 35*2^24 into 0 - 65535 */
324         if (state->snr >= 8960 * 0x10000)
325                 *strength = 0xffff;
326         else
327                 *strength = state->snr / 8960;
328
329         return 0;
330 }
331
332 static int or51211_read_ber(struct dvb_frontend* fe, u32* ber)
333 {
334         *ber = -ENOSYS;
335         return 0;
336 }
337
338 static int or51211_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
339 {
340         *ucblocks = -ENOSYS;
341         return 0;
342 }
343
344 static int or51211_sleep(struct dvb_frontend* fe)
345 {
346         return 0;
347 }
348
349 static int or51211_init(struct dvb_frontend* fe)
350 {
351         struct or51211_state* state = fe->demodulator_priv;
352         const struct or51211_config* config = state->config;
353         const struct firmware* fw;
354         unsigned char get_ver_buf[] = {0x04,0x00,0x30,0x00,0x00};
355         unsigned char rec_buf[14];
356         int ret,i;
357
358         if (!state->initialized) {
359                 /* Request the firmware, this will block until it uploads */
360                 pr_info("Waiting for firmware upload (%s)...\n",
361                         OR51211_DEFAULT_FIRMWARE);
362                 ret = config->request_firmware(fe, &fw,
363                                                OR51211_DEFAULT_FIRMWARE);
364                 pr_info("Got Hotplug firmware\n");
365                 if (ret) {
366                         pr_warn("No firmware uploaded (timeout or file not found?)\n");
367                         return ret;
368                 }
369
370                 ret = or51211_load_firmware(fe, fw);
371                 release_firmware(fw);
372                 if (ret) {
373                         pr_warn("Writing firmware to device failed!\n");
374                         return ret;
375                 }
376                 pr_info("Firmware upload complete.\n");
377
378                 /* Set operation mode in Receiver 1 register;
379                  * type 1:
380                  * data 0x50h  Automatic sets receiver channel conditions
381                  *             Automatic NTSC rejection filter
382                  *             Enable  MPEG serial data output
383                  *             MPEG2tr
384                  *             High tuner phase noise
385                  *             normal +/-150kHz Carrier acquisition range
386                  */
387                 if (i2c_writebytes(state,state->config->demod_address,
388                                    cmd_buf,3)) {
389                         pr_warn("Load DVR Error 5\n");
390                         return -1;
391                 }
392
393                 /* Read back ucode version to besure we loaded correctly */
394                 /* and are really up and running */
395                 rec_buf[0] = 0x04;
396                 rec_buf[1] = 0x00;
397                 rec_buf[2] = 0x03;
398                 rec_buf[3] = 0x00;
399                 msleep(30);
400                 if (i2c_writebytes(state,state->config->demod_address,
401                                    rec_buf,3)) {
402                         pr_warn("Load DVR Error A\n");
403                         return -1;
404                 }
405                 msleep(3);
406                 if (i2c_readbytes(state,state->config->demod_address,
407                                   &rec_buf[10],2)) {
408                         pr_warn("Load DVR Error B\n");
409                         return -1;
410                 }
411
412                 rec_buf[0] = 0x04;
413                 rec_buf[1] = 0x00;
414                 rec_buf[2] = 0x01;
415                 rec_buf[3] = 0x00;
416                 msleep(20);
417                 if (i2c_writebytes(state,state->config->demod_address,
418                                    rec_buf,3)) {
419                         pr_warn("Load DVR Error C\n");
420                         return -1;
421                 }
422                 msleep(3);
423                 if (i2c_readbytes(state,state->config->demod_address,
424                                   &rec_buf[12],2)) {
425                         pr_warn("Load DVR Error D\n");
426                         return -1;
427                 }
428
429                 for (i = 0; i < 8; i++)
430                         rec_buf[i]=0xed;
431
432                 for (i = 0; i < 5; i++) {
433                         msleep(30);
434                         get_ver_buf[4] = i+1;
435                         if (i2c_writebytes(state,state->config->demod_address,
436                                            get_ver_buf,5)) {
437                                 pr_warn("Load DVR Error 6 - %d\n", i);
438                                 return -1;
439                         }
440                         msleep(3);
441
442                         if (i2c_readbytes(state,state->config->demod_address,
443                                           &rec_buf[i*2],2)) {
444                                 pr_warn("Load DVR Error 7 - %d\n", i);
445                                 return -1;
446                         }
447                         /* If we didn't receive the right index, try again */
448                         if ((int)rec_buf[i*2+1]!=i+1){
449                           i--;
450                         }
451                 }
452                 dprintk("read_fwbits %10ph\n", rec_buf);
453
454                 pr_info("ver TU%02x%02x%02x VSB mode %02x Status %02x\n",
455                         rec_buf[2], rec_buf[4], rec_buf[6], rec_buf[12],
456                         rec_buf[10]);
457
458                 rec_buf[0] = 0x04;
459                 rec_buf[1] = 0x00;
460                 rec_buf[2] = 0x03;
461                 rec_buf[3] = 0x00;
462                 msleep(20);
463                 if (i2c_writebytes(state,state->config->demod_address,
464                                    rec_buf,3)) {
465                         pr_warn("Load DVR Error 8\n");
466                         return -1;
467                 }
468                 msleep(20);
469                 if (i2c_readbytes(state,state->config->demod_address,
470                                   &rec_buf[8],2)) {
471                         pr_warn("Load DVR Error 9\n");
472                         return -1;
473                 }
474                 state->initialized = 1;
475         }
476
477         return 0;
478 }
479
480 static int or51211_get_tune_settings(struct dvb_frontend* fe,
481                                      struct dvb_frontend_tune_settings* fesettings)
482 {
483         fesettings->min_delay_ms = 500;
484         fesettings->step_size = 0;
485         fesettings->max_drift = 0;
486         return 0;
487 }
488
489 static void or51211_release(struct dvb_frontend* fe)
490 {
491         struct or51211_state* state = fe->demodulator_priv;
492         state->config->sleep(fe);
493         kfree(state);
494 }
495
496 static const struct dvb_frontend_ops or51211_ops;
497
498 struct dvb_frontend* or51211_attach(const struct or51211_config* config,
499                                     struct i2c_adapter* i2c)
500 {
501         struct or51211_state* state = NULL;
502
503         /* Allocate memory for the internal state */
504         state = kzalloc(sizeof(struct or51211_state), GFP_KERNEL);
505         if (state == NULL)
506                 return NULL;
507
508         /* Setup the state */
509         state->config = config;
510         state->i2c = i2c;
511         state->initialized = 0;
512         state->current_frequency = 0;
513
514         /* Create dvb_frontend */
515         memcpy(&state->frontend.ops, &or51211_ops, sizeof(struct dvb_frontend_ops));
516         state->frontend.demodulator_priv = state;
517         return &state->frontend;
518 }
519
520 static const struct dvb_frontend_ops or51211_ops = {
521         .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
522         .info = {
523                 .name                  = "Oren OR51211 VSB Frontend",
524                 .frequency_min_hz      =  44 * MHz,
525                 .frequency_max_hz      = 958 * MHz,
526                 .frequency_stepsize_hz = 166666,
527                 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
528                         FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
529                         FE_CAN_8VSB
530         },
531
532         .release = or51211_release,
533
534         .init = or51211_init,
535         .sleep = or51211_sleep,
536
537         .set_frontend = or51211_set_parameters,
538         .get_tune_settings = or51211_get_tune_settings,
539
540         .read_status = or51211_read_status,
541         .read_ber = or51211_read_ber,
542         .read_signal_strength = or51211_read_signal_strength,
543         .read_snr = or51211_read_snr,
544         .read_ucblocks = or51211_read_ucblocks,
545 };
546
547 module_param(debug, int, 0644);
548 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
549
550 MODULE_DESCRIPTION("Oren OR51211 VSB [pcHDTV HD-2000] Demodulator Driver");
551 MODULE_AUTHOR("Kirk Lapray");
552 MODULE_LICENSE("GPL");
553
554 EXPORT_SYMBOL(or51211_attach);
555