1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include "anysee.h"
35#include "dvb-pll.h"
36#include "tda1002x.h"
37#include "mt352.h"
38#include "mt352_priv.h"
39#include "zl10353.h"
40#include "tda18212.h"
41#include "cx24116.h"
42#include "stv0900.h"
43#include "stv6110.h"
44#include "isl6423.h"
45#include "cxd2820r.h"
46
47DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
48
49static int anysee_ctrl_msg(struct dvb_usb_device *d,
50 u8 *sbuf, u8 slen, u8 *rbuf, u8 rlen)
51{
52 struct anysee_state *state = d_to_priv(d);
53 int act_len, ret, i;
54
55 mutex_lock(&d->usb_mutex);
56
57 memcpy(&state->buf[0], sbuf, slen);
58 state->buf[60] = state->seq++;
59
60 dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, slen, state->buf);
61
62
63
64 ret = dvb_usbv2_generic_rw_locked(d, state->buf, sizeof(state->buf),
65 state->buf, sizeof(state->buf));
66 if (ret)
67 goto error_unlock;
68
69
70
71
72
73
74
75
76
77
78
79
80
81 for (i = 0; i < 3; i++) {
82
83 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
84 d->props->generic_bulk_ctrl_endpoint),
85 state->buf, sizeof(state->buf), &act_len, 2000);
86 if (ret) {
87 dev_dbg(&d->udev->dev,
88 "%s: recv bulk message failed=%d\n",
89 __func__, ret);
90 } else {
91 dev_dbg(&d->udev->dev, "%s: <<< %*ph\n", __func__,
92 rlen, state->buf);
93
94 if (state->buf[63] != 0x4f)
95 dev_dbg(&d->udev->dev,
96 "%s: cmd failed\n", __func__);
97 break;
98 }
99 }
100
101 if (ret) {
102
103 dev_err(&d->udev->dev, "%s: recv bulk message failed=%d\n",
104 KBUILD_MODNAME, ret);
105 goto error_unlock;
106 }
107
108
109 if (rbuf && rlen)
110 memcpy(rbuf, state->buf, rlen);
111
112error_unlock:
113 mutex_unlock(&d->usb_mutex);
114 return ret;
115}
116
117static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
118{
119 u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
120 int ret;
121 ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
122 dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, *val);
123 return ret;
124}
125
126static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
127{
128 u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
129 dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, val);
130 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
131}
132
133
134static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
135 u8 mask)
136{
137 int ret;
138 u8 tmp;
139
140
141 if (mask != 0xff) {
142 ret = anysee_read_reg(d, reg, &tmp);
143 if (ret)
144 return ret;
145
146 val &= mask;
147 tmp &= ~mask;
148 val |= tmp;
149 }
150
151 return anysee_write_reg(d, reg, val);
152}
153
154
155static int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val,
156 u8 mask)
157{
158 int ret, i;
159 u8 tmp;
160
161 ret = anysee_read_reg(d, reg, &tmp);
162 if (ret)
163 return ret;
164
165 tmp &= mask;
166
167
168 for (i = 0; i < 8; i++) {
169 if ((mask >> i) & 0x01)
170 break;
171 }
172 *val = tmp >> i;
173
174 return 0;
175}
176
177static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
178{
179 u8 buf[] = {CMD_GET_HW_INFO};
180 return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
181}
182
183static int anysee_streaming_ctrl(struct dvb_frontend *fe, int onoff)
184{
185 u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
186 dev_dbg(&fe_to_d(fe)->udev->dev, "%s: onoff=%d\n", __func__, onoff);
187 return anysee_ctrl_msg(fe_to_d(fe), buf, sizeof(buf), NULL, 0);
188}
189
190static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
191{
192 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
193 dev_dbg(&d->udev->dev, "%s: state=%d interval=%d\n", __func__,
194 mode, interval);
195 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
196}
197
198static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
199{
200 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
201 dev_dbg(&d->udev->dev, "%s: onoff=%d\n", __func__, onoff);
202 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
203}
204
205
206static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
207 int num)
208{
209 struct dvb_usb_device *d = i2c_get_adapdata(adap);
210 int ret = 0, inc, i = 0;
211 u8 buf[52];
212
213 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
214 return -EAGAIN;
215
216 while (i < num) {
217 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
218 if (msg[i].len > 2 || msg[i+1].len > 60) {
219 ret = -EOPNOTSUPP;
220 break;
221 }
222 buf[0] = CMD_I2C_READ;
223 buf[1] = (msg[i].addr << 1) | 0x01;
224 buf[2] = msg[i].buf[0];
225 buf[3] = msg[i].buf[1];
226 buf[4] = msg[i].len-1;
227 buf[5] = msg[i+1].len;
228 ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
229 msg[i+1].len);
230 inc = 2;
231 } else {
232 if (msg[i].len > 48) {
233 ret = -EOPNOTSUPP;
234 break;
235 }
236 buf[0] = CMD_I2C_WRITE;
237 buf[1] = (msg[i].addr << 1);
238 buf[2] = msg[i].len;
239 buf[3] = 0x01;
240 memcpy(&buf[4], msg[i].buf, msg[i].len);
241 ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
242 inc = 1;
243 }
244 if (ret)
245 break;
246
247 i += inc;
248 }
249
250 mutex_unlock(&d->i2c_mutex);
251
252 return ret ? ret : i;
253}
254
255static u32 anysee_i2c_func(struct i2c_adapter *adapter)
256{
257 return I2C_FUNC_I2C;
258}
259
260static struct i2c_algorithm anysee_i2c_algo = {
261 .master_xfer = anysee_master_xfer,
262 .functionality = anysee_i2c_func,
263};
264
265static int anysee_mt352_demod_init(struct dvb_frontend *fe)
266{
267 static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x28 };
268 static u8 reset[] = { RESET, 0x80 };
269 static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
270 static u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 };
271 static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
272 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
273
274 mt352_write(fe, clock_config, sizeof(clock_config));
275 udelay(200);
276 mt352_write(fe, reset, sizeof(reset));
277 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
278
279 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
280 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
281 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
282
283 return 0;
284}
285
286
287static struct tda10023_config anysee_tda10023_config = {
288 .demod_address = (0x1a >> 1),
289 .invert = 0,
290 .xtal = 16000000,
291 .pll_m = 11,
292 .pll_p = 3,
293 .pll_n = 1,
294 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
295 .deltaf = 0xfeeb,
296};
297
298static struct mt352_config anysee_mt352_config = {
299 .demod_address = (0x1e >> 1),
300 .demod_init = anysee_mt352_demod_init,
301};
302
303static struct zl10353_config anysee_zl10353_config = {
304 .demod_address = (0x1e >> 1),
305 .parallel_ts = 1,
306};
307
308static struct zl10353_config anysee_zl10353_tda18212_config2 = {
309 .demod_address = (0x1e >> 1),
310 .parallel_ts = 1,
311 .disable_i2c_gate_ctrl = 1,
312 .no_tuner = 1,
313 .if2 = 41500,
314};
315
316static struct zl10353_config anysee_zl10353_tda18212_config = {
317 .demod_address = (0x18 >> 1),
318 .parallel_ts = 1,
319 .disable_i2c_gate_ctrl = 1,
320 .no_tuner = 1,
321 .if2 = 41500,
322};
323
324static struct tda10023_config anysee_tda10023_tda18212_config = {
325 .demod_address = (0x1a >> 1),
326 .xtal = 16000000,
327 .pll_m = 12,
328 .pll_p = 3,
329 .pll_n = 1,
330 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
331 .deltaf = 0xba02,
332};
333
334static struct tda18212_config anysee_tda18212_config = {
335 .if_dvbt_6 = 4150,
336 .if_dvbt_7 = 4150,
337 .if_dvbt_8 = 4150,
338 .if_dvbc = 5000,
339};
340
341static struct tda18212_config anysee_tda18212_config2 = {
342 .if_dvbt_6 = 3550,
343 .if_dvbt_7 = 3700,
344 .if_dvbt_8 = 4150,
345 .if_dvbt2_6 = 3250,
346 .if_dvbt2_7 = 4000,
347 .if_dvbt2_8 = 4000,
348 .if_dvbc = 5000,
349};
350
351static struct cx24116_config anysee_cx24116_config = {
352 .demod_address = (0xaa >> 1),
353 .mpg_clk_pos_pol = 0x00,
354 .i2c_wr_max = 48,
355};
356
357static struct stv0900_config anysee_stv0900_config = {
358 .demod_address = (0xd0 >> 1),
359 .demod_mode = 0,
360 .xtal = 8000000,
361 .clkmode = 3,
362 .diseqc_mode = 2,
363 .tun1_maddress = 0,
364 .tun1_adc = 1,
365 .path1_mode = 3,
366};
367
368static struct stv6110_config anysee_stv6110_config = {
369 .i2c_address = (0xc0 >> 1),
370 .mclk = 16000000,
371 .clk_div = 1,
372};
373
374static struct isl6423_config anysee_isl6423_config = {
375 .current_max = SEC_CURRENT_800m,
376 .curlim = SEC_CURRENT_LIM_OFF,
377 .mod_extern = 1,
378 .addr = (0x10 >> 1),
379};
380
381static struct cxd2820r_config anysee_cxd2820r_config = {
382 .i2c_address = 0x6d,
383 .ts_mode = 0x38,
384};
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502static int anysee_read_config(struct dvb_usb_device *d)
503{
504 struct anysee_state *state = d_to_priv(d);
505 int ret;
506 u8 hw_info[3];
507
508
509
510
511
512 ret = anysee_get_hw_info(d, hw_info);
513 if (ret)
514 goto error;
515
516 ret = anysee_get_hw_info(d, hw_info);
517 if (ret)
518 goto error;
519
520
521
522
523 dev_info(&d->udev->dev, "%s: firmware version %d.%d hardware id %d\n",
524 KBUILD_MODNAME, hw_info[1], hw_info[2], hw_info[0]);
525
526 state->hw = hw_info[0];
527error:
528 return ret;
529}
530
531
532static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
533{
534
535 return anysee_wr_reg_mask(fe_to_d(fe), REG_IOE, (enable << 4), 0x10);
536}
537
538static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
539{
540 struct anysee_state *state = fe_to_priv(fe);
541 struct dvb_usb_device *d = fe_to_d(fe);
542 int ret;
543 dev_dbg(&d->udev->dev, "%s: fe=%d onoff=%d\n", __func__, fe->id, onoff);
544
545
546 if (onoff == 0)
547 return 0;
548
549 switch (state->hw) {
550 case ANYSEE_HW_507FA:
551
552
553
554 if (fe->id == 0) {
555
556 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01);
557 if (ret)
558 goto error;
559
560
561 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
562 if (ret)
563 goto error;
564
565
566 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01);
567 if (ret)
568 goto error;
569 } else {
570
571 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
572 if (ret)
573 goto error;
574
575
576 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
577 if (ret)
578 goto error;
579
580
581 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01);
582 if (ret)
583 goto error;
584 }
585
586 break;
587 case ANYSEE_HW_508TC:
588 case ANYSEE_HW_508PTC:
589
590
591
592 if (fe->id == 0) {
593
594 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40);
595 if (ret)
596 goto error;
597
598
599 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
600 if (ret)
601 goto error;
602
603
604 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01);
605 if (ret)
606 goto error;
607 } else {
608
609 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
610 if (ret)
611 goto error;
612
613
614 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40);
615 if (ret)
616 goto error;
617
618
619 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01);
620 if (ret)
621 goto error;
622 }
623
624 break;
625 default:
626 ret = 0;
627 }
628
629error:
630 return ret;
631}
632
633static int anysee_add_i2c_dev(struct dvb_usb_device *d, const char *type,
634 u8 addr, void *platform_data)
635{
636 int ret, num;
637 struct anysee_state *state = d_to_priv(d);
638 struct i2c_client *client;
639 struct i2c_adapter *adapter = &d->i2c_adap;
640 struct i2c_board_info board_info = {
641 .addr = addr,
642 .platform_data = platform_data,
643 };
644
645 strlcpy(board_info.type, type, I2C_NAME_SIZE);
646
647
648 for (num = 0; num < ANYSEE_I2C_CLIENT_MAX; num++) {
649 if (state->i2c_client[num] == NULL)
650 break;
651 }
652
653 dev_dbg(&d->udev->dev, "%s: num=%d\n", __func__, num);
654
655 if (num == ANYSEE_I2C_CLIENT_MAX) {
656 dev_err(&d->udev->dev, "%s: I2C client out of index\n",
657 KBUILD_MODNAME);
658 ret = -ENODEV;
659 goto err;
660 }
661
662 request_module("%s", board_info.type);
663
664
665 client = i2c_new_device(adapter, &board_info);
666 if (client == NULL || client->dev.driver == NULL) {
667 ret = -ENODEV;
668 goto err;
669 }
670
671
672 if (!try_module_get(client->dev.driver->owner)) {
673 i2c_unregister_device(client);
674 ret = -ENODEV;
675 goto err;
676 }
677
678 state->i2c_client[num] = client;
679 return 0;
680err:
681 dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret);
682 return ret;
683}
684
685static void anysee_del_i2c_dev(struct dvb_usb_device *d)
686{
687 int num;
688 struct anysee_state *state = d_to_priv(d);
689 struct i2c_client *client;
690
691
692 num = ANYSEE_I2C_CLIENT_MAX;
693 while (num--) {
694 if (state->i2c_client[num] != NULL)
695 break;
696 }
697
698 dev_dbg(&d->udev->dev, "%s: num=%d\n", __func__, num);
699
700 if (num == -1) {
701 dev_err(&d->udev->dev, "%s: I2C client out of index\n",
702 KBUILD_MODNAME);
703 goto err;
704 }
705
706 client = state->i2c_client[num];
707
708
709 module_put(client->dev.driver->owner);
710
711
712 i2c_unregister_device(client);
713
714 state->i2c_client[num] = NULL;
715err:
716 dev_dbg(&d->udev->dev, "%s: failed\n", __func__);
717}
718
719static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
720{
721 struct anysee_state *state = adap_to_priv(adap);
722 struct dvb_usb_device *d = adap_to_d(adap);
723 int ret = 0;
724 u8 tmp;
725 struct i2c_msg msg[2] = {
726 {
727 .addr = 0x60,
728 .flags = 0,
729 .len = 1,
730 .buf = "\x00",
731 }, {
732 .addr = 0x60,
733 .flags = I2C_M_RD,
734 .len = 1,
735 .buf = &tmp,
736 }
737 };
738
739 switch (state->hw) {
740 case ANYSEE_HW_507T:
741
742
743
744 adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config,
745 &d->i2c_adap);
746 if (adap->fe[0])
747 break;
748
749
750 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
751 &d->i2c_adap);
752
753 break;
754 case ANYSEE_HW_507CD:
755
756
757
758 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
759 if (ret)
760 goto error;
761
762
763 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
764 if (ret)
765 goto error;
766
767
768 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
769 &d->i2c_adap);
770
771 break;
772 case ANYSEE_HW_507DC:
773
774
775
776 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
777 if (ret)
778 goto error;
779
780
781 adap->fe[0] = dvb_attach(tda10023_attach,
782 &anysee_tda10023_config, &d->i2c_adap, 0x48);
783
784 break;
785 case ANYSEE_HW_507SI:
786
787
788
789 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
790 if (ret)
791 goto error;
792
793
794 adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config,
795 &d->i2c_adap);
796
797 break;
798 case ANYSEE_HW_507FA:
799
800
801
802
803 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 4), 0x10);
804 if (ret)
805 goto error;
806
807
808 tmp = 0;
809 ret = i2c_transfer(&d->i2c_adap, msg, 2);
810 if (ret == 2 && tmp == 0xc7) {
811 dev_dbg(&d->udev->dev, "%s: TDA18212 found\n",
812 __func__);
813 state->has_tda18212 = true;
814 }
815 else
816 tmp = 0;
817
818
819 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 4), 0x10);
820 if (ret)
821 goto error;
822
823
824 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01);
825 if (ret)
826 goto error;
827
828
829 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
830 if (ret)
831 goto error;
832
833
834 if (tmp == 0xc7) {
835
836 adap->fe[0] = dvb_attach(tda10023_attach,
837 &anysee_tda10023_tda18212_config,
838 &d->i2c_adap, 0x48);
839
840
841 if (adap->fe[0])
842 adap->fe[0]->ops.i2c_gate_ctrl =
843 anysee_i2c_gate_ctrl;
844 } else {
845
846 adap->fe[0] = dvb_attach(tda10023_attach,
847 &anysee_tda10023_config,
848 &d->i2c_adap, 0x48);
849 }
850
851
852 if (!adap->fe[0])
853 break;
854
855
856 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
857 if (ret)
858 goto error;
859
860
861 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
862 if (ret)
863 goto error;
864
865
866 if (tmp == 0xc7) {
867
868 adap->fe[1] = dvb_attach(zl10353_attach,
869 &anysee_zl10353_tda18212_config2,
870 &d->i2c_adap);
871
872
873 if (adap->fe[1])
874 adap->fe[1]->ops.i2c_gate_ctrl =
875 anysee_i2c_gate_ctrl;
876 } else {
877
878 adap->fe[1] = dvb_attach(zl10353_attach,
879 &anysee_zl10353_config,
880 &d->i2c_adap);
881 }
882
883 break;
884 case ANYSEE_HW_508TC:
885 case ANYSEE_HW_508PTC:
886
887
888
889
890 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40);
891 if (ret)
892 goto error;
893
894
895 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
896 if (ret)
897 goto error;
898
899
900 adap->fe[0] = dvb_attach(tda10023_attach,
901 &anysee_tda10023_tda18212_config,
902 &d->i2c_adap, 0x48);
903
904
905 if (adap->fe[0])
906 adap->fe[0]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
907
908
909 if (!adap->fe[0])
910 break;
911
912
913 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
914 if (ret)
915 goto error;
916
917
918 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40);
919 if (ret)
920 goto error;
921
922
923 adap->fe[1] = dvb_attach(zl10353_attach,
924 &anysee_zl10353_tda18212_config,
925 &d->i2c_adap);
926
927
928 if (adap->fe[1])
929 adap->fe[1]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
930
931 state->has_ci = true;
932
933 break;
934 case ANYSEE_HW_508S2:
935 case ANYSEE_HW_508PS2:
936
937
938
939
940 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20);
941 if (ret)
942 goto error;
943
944
945 adap->fe[0] = dvb_attach(stv0900_attach,
946 &anysee_stv0900_config, &d->i2c_adap, 0);
947
948 state->has_ci = true;
949
950 break;
951 case ANYSEE_HW_508T2C:
952
953
954
955 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20);
956 if (ret)
957 goto error;
958
959
960 adap->fe[0] = dvb_attach(cxd2820r_attach,
961 &anysee_cxd2820r_config, &d->i2c_adap, NULL);
962
963 state->has_ci = true;
964
965 break;
966 }
967
968 if (!adap->fe[0]) {
969
970 ret = -ENODEV;
971 dev_err(&d->udev->dev,
972 "%s: Unsupported Anysee version. Please report to <linux-media@vger.kernel.org>.\n",
973 KBUILD_MODNAME);
974 }
975error:
976 return ret;
977}
978
979static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
980{
981 struct anysee_state *state = adap_to_priv(adap);
982 struct dvb_usb_device *d = adap_to_d(adap);
983 struct dvb_frontend *fe;
984 int ret;
985 dev_dbg(&d->udev->dev, "%s:\n", __func__);
986
987 switch (state->hw) {
988 case ANYSEE_HW_507T:
989
990
991
992 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1), NULL,
993 DVB_PLL_THOMSON_DTT7579);
994
995 break;
996 case ANYSEE_HW_507CD:
997
998
999
1000 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
1001 &d->i2c_adap, DVB_PLL_THOMSON_DTT7579);
1002
1003 break;
1004 case ANYSEE_HW_507DC:
1005
1006
1007
1008 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
1009 &d->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
1010
1011 break;
1012 case ANYSEE_HW_507SI:
1013
1014
1015
1016 fe = dvb_attach(isl6423_attach, adap->fe[0], &d->i2c_adap,
1017 &anysee_isl6423_config);
1018
1019 break;
1020 case ANYSEE_HW_507FA:
1021
1022
1023
1024
1025
1026
1027
1028 if (state->has_tda18212) {
1029 struct tda18212_config tda18212_config =
1030 anysee_tda18212_config;
1031
1032 tda18212_config.fe = adap->fe[0];
1033 ret = anysee_add_i2c_dev(d, "tda18212", 0x60,
1034 &tda18212_config);
1035 if (ret)
1036 goto err;
1037
1038
1039 if (adap->fe[1]) {
1040 adap->fe[1]->tuner_priv =
1041 adap->fe[0]->tuner_priv;
1042 memcpy(&adap->fe[1]->ops.tuner_ops,
1043 &adap->fe[0]->ops.tuner_ops,
1044 sizeof(struct dvb_tuner_ops));
1045 }
1046
1047 return 0;
1048 } else {
1049
1050 fe = dvb_attach(dvb_pll_attach, adap->fe[0],
1051 (0xc0 >> 1), &d->i2c_adap,
1052 DVB_PLL_SAMSUNG_DTOS403IH102A);
1053
1054 if (fe && adap->fe[1]) {
1055
1056 fe = dvb_attach(dvb_pll_attach, adap->fe[1],
1057 (0xc0 >> 1), &d->i2c_adap,
1058 DVB_PLL_SAMSUNG_DTOS403IH102A);
1059 }
1060 }
1061
1062 break;
1063 case ANYSEE_HW_508TC:
1064 case ANYSEE_HW_508PTC:
1065 {
1066
1067
1068 struct tda18212_config tda18212_config = anysee_tda18212_config;
1069
1070 tda18212_config.fe = adap->fe[0];
1071 ret = anysee_add_i2c_dev(d, "tda18212", 0x60, &tda18212_config);
1072 if (ret)
1073 goto err;
1074
1075
1076 if (adap->fe[1]) {
1077 adap->fe[1]->tuner_priv = adap->fe[0]->tuner_priv;
1078 memcpy(&adap->fe[1]->ops.tuner_ops,
1079 &adap->fe[0]->ops.tuner_ops,
1080 sizeof(struct dvb_tuner_ops));
1081 }
1082
1083 return 0;
1084 }
1085 case ANYSEE_HW_508S2:
1086 case ANYSEE_HW_508PS2:
1087
1088
1089
1090
1091 fe = dvb_attach(stv6110_attach, adap->fe[0],
1092 &anysee_stv6110_config, &d->i2c_adap);
1093
1094 if (fe) {
1095
1096 fe = dvb_attach(isl6423_attach, adap->fe[0],
1097 &d->i2c_adap, &anysee_isl6423_config);
1098 }
1099
1100 break;
1101
1102 case ANYSEE_HW_508T2C:
1103 {
1104
1105 struct tda18212_config tda18212_config =
1106 anysee_tda18212_config2;
1107
1108 tda18212_config.fe = adap->fe[0];
1109 ret = anysee_add_i2c_dev(d, "tda18212", 0x60, &tda18212_config);
1110 if (ret)
1111 goto err;
1112
1113 return 0;
1114 }
1115 default:
1116 fe = NULL;
1117 }
1118
1119 if (fe)
1120 ret = 0;
1121 else
1122 ret = -ENODEV;
1123err:
1124 return ret;
1125}
1126
1127#if IS_ENABLED(CONFIG_RC_CORE)
1128static int anysee_rc_query(struct dvb_usb_device *d)
1129{
1130 u8 buf[] = {CMD_GET_IR_CODE};
1131 u8 ircode[2];
1132 int ret;
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
1143 if (ret)
1144 return ret;
1145
1146 if (ircode[0]) {
1147 dev_dbg(&d->udev->dev, "%s: key pressed %02x\n", __func__,
1148 ircode[1]);
1149 rc_keydown(d->rc_dev, RC_TYPE_NEC,
1150 RC_SCANCODE_NEC(0x08, ircode[1]), 0);
1151 }
1152
1153 return 0;
1154}
1155
1156static int anysee_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
1157{
1158 rc->allowed_protos = RC_BIT_NEC;
1159 rc->query = anysee_rc_query;
1160 rc->interval = 250;
1161
1162 return 0;
1163}
1164#else
1165 #define anysee_get_rc_config NULL
1166#endif
1167
1168static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1169 int addr)
1170{
1171 struct dvb_usb_device *d = ci->data;
1172 int ret;
1173 u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1};
1174 u8 val;
1175
1176 ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1177 if (ret)
1178 return ret;
1179
1180 return val;
1181}
1182
1183static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1184 int addr, u8 val)
1185{
1186 struct dvb_usb_device *d = ci->data;
1187 int ret;
1188 u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
1189
1190 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1191 if (ret)
1192 return ret;
1193
1194 return 0;
1195}
1196
1197static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
1198 u8 addr)
1199{
1200 struct dvb_usb_device *d = ci->data;
1201 int ret;
1202 u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
1203 u8 val;
1204
1205 ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1206 if (ret)
1207 return ret;
1208
1209 return val;
1210}
1211
1212static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
1213 u8 addr, u8 val)
1214{
1215 struct dvb_usb_device *d = ci->data;
1216 int ret;
1217 u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
1218
1219 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1220 if (ret)
1221 return ret;
1222
1223 return 0;
1224}
1225
1226static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
1227{
1228 struct dvb_usb_device *d = ci->data;
1229 int ret;
1230 struct anysee_state *state = d_to_priv(d);
1231
1232 state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
1233
1234 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1235 if (ret)
1236 return ret;
1237
1238 msleep(300);
1239
1240 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1241 if (ret)
1242 return ret;
1243
1244 return 0;
1245}
1246
1247static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
1248{
1249 struct dvb_usb_device *d = ci->data;
1250 int ret;
1251
1252 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1253 if (ret)
1254 return ret;
1255
1256 msleep(30);
1257
1258 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1259 if (ret)
1260 return ret;
1261
1262 return 0;
1263}
1264
1265static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
1266{
1267 struct dvb_usb_device *d = ci->data;
1268 int ret;
1269
1270 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
1271 if (ret)
1272 return ret;
1273
1274 return 0;
1275}
1276
1277static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
1278 int open)
1279{
1280 struct dvb_usb_device *d = ci->data;
1281 struct anysee_state *state = d_to_priv(d);
1282 int ret;
1283 u8 tmp = 0;
1284
1285 ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
1286 if (ret)
1287 return ret;
1288
1289 if (tmp == 0) {
1290 ret = DVB_CA_EN50221_POLL_CAM_PRESENT;
1291 if (time_after(jiffies, state->ci_cam_ready))
1292 ret |= DVB_CA_EN50221_POLL_CAM_READY;
1293 }
1294
1295 return ret;
1296}
1297
1298static int anysee_ci_init(struct dvb_usb_device *d)
1299{
1300 struct anysee_state *state = d_to_priv(d);
1301 int ret;
1302
1303 state->ci.owner = THIS_MODULE;
1304 state->ci.read_attribute_mem = anysee_ci_read_attribute_mem;
1305 state->ci.write_attribute_mem = anysee_ci_write_attribute_mem;
1306 state->ci.read_cam_control = anysee_ci_read_cam_control;
1307 state->ci.write_cam_control = anysee_ci_write_cam_control;
1308 state->ci.slot_reset = anysee_ci_slot_reset;
1309 state->ci.slot_shutdown = anysee_ci_slot_shutdown;
1310 state->ci.slot_ts_enable = anysee_ci_slot_ts_enable;
1311 state->ci.poll_slot_status = anysee_ci_poll_slot_status;
1312 state->ci.data = d;
1313
1314 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1315 if (ret)
1316 return ret;
1317
1318 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 2)|(0 << 1)|(0 << 0), 0x07);
1319 if (ret)
1320 return ret;
1321
1322 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 2)|(1 << 1)|(1 << 0), 0x07);
1323 if (ret)
1324 return ret;
1325
1326 ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
1327 if (ret)
1328 return ret;
1329
1330 state->ci_attached = true;
1331
1332 return 0;
1333}
1334
1335static void anysee_ci_release(struct dvb_usb_device *d)
1336{
1337 struct anysee_state *state = d_to_priv(d);
1338
1339
1340 if (state->ci_attached)
1341 dvb_ca_en50221_release(&state->ci);
1342
1343 return;
1344}
1345
1346static int anysee_init(struct dvb_usb_device *d)
1347{
1348 struct anysee_state *state = d_to_priv(d);
1349 int ret;
1350
1351
1352
1353
1354
1355 ret = usb_set_interface(d->udev, 0, 0);
1356 if (ret)
1357 return ret;
1358
1359
1360 ret = anysee_led_ctrl(d, 0x01, 0x03);
1361 if (ret)
1362 return ret;
1363
1364
1365 ret = anysee_ir_ctrl(d, 1);
1366 if (ret)
1367 return ret;
1368
1369
1370 if (state->has_ci) {
1371 ret = anysee_ci_init(d);
1372 if (ret)
1373 return ret;
1374 }
1375
1376 return 0;
1377}
1378
1379static void anysee_exit(struct dvb_usb_device *d)
1380{
1381 struct anysee_state *state = d_to_priv(d);
1382
1383 if (state->i2c_client[0])
1384 anysee_del_i2c_dev(d);
1385
1386 return anysee_ci_release(d);
1387}
1388
1389
1390static struct dvb_usb_device_properties anysee_props = {
1391 .driver_name = KBUILD_MODNAME,
1392 .owner = THIS_MODULE,
1393 .adapter_nr = adapter_nr,
1394 .size_of_priv = sizeof(struct anysee_state),
1395
1396 .generic_bulk_ctrl_endpoint = 0x01,
1397 .generic_bulk_ctrl_endpoint_response = 0x81,
1398
1399 .i2c_algo = &anysee_i2c_algo,
1400 .read_config = anysee_read_config,
1401 .frontend_attach = anysee_frontend_attach,
1402 .tuner_attach = anysee_tuner_attach,
1403 .init = anysee_init,
1404 .get_rc_config = anysee_get_rc_config,
1405 .frontend_ctrl = anysee_frontend_ctrl,
1406 .streaming_ctrl = anysee_streaming_ctrl,
1407 .exit = anysee_exit,
1408
1409 .num_adapters = 1,
1410 .adapter = {
1411 {
1412 .stream = DVB_USB_STREAM_BULK(0x82, 8, 16 * 512),
1413 }
1414 }
1415};
1416
1417static const struct usb_device_id anysee_id_table[] = {
1418 { DVB_USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE,
1419 &anysee_props, "Anysee", RC_MAP_ANYSEE) },
1420 { DVB_USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE,
1421 &anysee_props, "Anysee", RC_MAP_ANYSEE) },
1422 { }
1423};
1424MODULE_DEVICE_TABLE(usb, anysee_id_table);
1425
1426static struct usb_driver anysee_usb_driver = {
1427 .name = KBUILD_MODNAME,
1428 .id_table = anysee_id_table,
1429 .probe = dvb_usbv2_probe,
1430 .disconnect = dvb_usbv2_disconnect,
1431 .suspend = dvb_usbv2_suspend,
1432 .resume = dvb_usbv2_resume,
1433 .reset_resume = dvb_usbv2_reset_resume,
1434 .no_dynamic_id = 1,
1435 .soft_unbind = 1,
1436};
1437
1438module_usb_driver(anysee_usb_driver);
1439
1440MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1441MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1442MODULE_LICENSE("GPL");
1443