diff options
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r-- | drivers/media/dvb/frontends/af9033.c | 49 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/af9033_priv.h | 98 |
2 files changed, 146 insertions, 1 deletions
diff --git a/drivers/media/dvb/frontends/af9033.c b/drivers/media/dvb/frontends/af9033.c index 9ade510f9dfe..40ef4b1faebc 100644 --- a/drivers/media/dvb/frontends/af9033.c +++ b/drivers/media/dvb/frontends/af9033.c | |||
@@ -540,9 +540,56 @@ err: | |||
540 | 540 | ||
541 | static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr) | 541 | static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr) |
542 | { | 542 | { |
543 | *snr = 0; | 543 | struct af9033_state *state = fe->demodulator_priv; |
544 | int ret, i, len; | ||
545 | u8 buf[3], tmp; | ||
546 | u32 snr_val; | ||
547 | const struct val_snr *uninitialized_var(snr_lut); | ||
548 | |||
549 | /* read value */ | ||
550 | ret = af9033_rd_regs(state, 0x80002c, buf, 3); | ||
551 | if (ret < 0) | ||
552 | goto err; | ||
553 | |||
554 | snr_val = (buf[2] << 16) | (buf[1] << 8) | buf[0]; | ||
555 | |||
556 | /* read current modulation */ | ||
557 | ret = af9033_rd_reg(state, 0x80f903, &tmp); | ||
558 | if (ret < 0) | ||
559 | goto err; | ||
560 | |||
561 | switch ((tmp >> 0) & 3) { | ||
562 | case 0: | ||
563 | len = ARRAY_SIZE(qpsk_snr_lut); | ||
564 | snr_lut = qpsk_snr_lut; | ||
565 | break; | ||
566 | case 1: | ||
567 | len = ARRAY_SIZE(qam16_snr_lut); | ||
568 | snr_lut = qam16_snr_lut; | ||
569 | break; | ||
570 | case 2: | ||
571 | len = ARRAY_SIZE(qam64_snr_lut); | ||
572 | snr_lut = qam64_snr_lut; | ||
573 | break; | ||
574 | default: | ||
575 | goto err; | ||
576 | } | ||
577 | |||
578 | for (i = 0; i < len; i++) { | ||
579 | tmp = snr_lut[i].snr; | ||
580 | |||
581 | if (snr_val < snr_lut[i].val) | ||
582 | break; | ||
583 | } | ||
584 | |||
585 | *snr = tmp * 10; /* dB/10 */ | ||
544 | 586 | ||
545 | return 0; | 587 | return 0; |
588 | |||
589 | err: | ||
590 | pr_debug("%s: failed=%d\n", __func__, ret); | ||
591 | |||
592 | return ret; | ||
546 | } | 593 | } |
547 | 594 | ||
548 | static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | 595 | static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) |
diff --git a/drivers/media/dvb/frontends/af9033_priv.h b/drivers/media/dvb/frontends/af9033_priv.h index 2bf579d89a83..f0096298d2ac 100644 --- a/drivers/media/dvb/frontends/af9033_priv.h +++ b/drivers/media/dvb/frontends/af9033_priv.h | |||
@@ -47,6 +47,11 @@ struct clock_adc { | |||
47 | u32 adc; | 47 | u32 adc; |
48 | }; | 48 | }; |
49 | 49 | ||
50 | struct val_snr { | ||
51 | u32 val; | ||
52 | u8 snr; | ||
53 | }; | ||
54 | |||
50 | /* Xtal clock vs. ADC clock lookup table */ | 55 | /* Xtal clock vs. ADC clock lookup table */ |
51 | static const struct clock_adc clock_adc_lut[] = { | 56 | static const struct clock_adc clock_adc_lut[] = { |
52 | { 16384000, 20480000 }, | 57 | { 16384000, 20480000 }, |
@@ -85,6 +90,99 @@ static const struct coeff coeff_lut[] = { | |||
85 | }, | 90 | }, |
86 | }; | 91 | }; |
87 | 92 | ||
93 | /* QPSK SNR lookup table */ | ||
94 | static const struct val_snr qpsk_snr_lut[] = { | ||
95 | { 0x0b4771, 0 }, | ||
96 | { 0x0c1aed, 1 }, | ||
97 | { 0x0d0d27, 2 }, | ||
98 | { 0x0e4d19, 3 }, | ||
99 | { 0x0e5da8, 4 }, | ||
100 | { 0x107097, 5 }, | ||
101 | { 0x116975, 6 }, | ||
102 | { 0x1252d9, 7 }, | ||
103 | { 0x131fa4, 8 }, | ||
104 | { 0x13d5e1, 9 }, | ||
105 | { 0x148e53, 10 }, | ||
106 | { 0x15358b, 11 }, | ||
107 | { 0x15dd29, 12 }, | ||
108 | { 0x168112, 13 }, | ||
109 | { 0x170b61, 14 }, | ||
110 | { 0x17a532, 15 }, | ||
111 | { 0x180f94, 16 }, | ||
112 | { 0x186ed2, 17 }, | ||
113 | { 0x18b271, 18 }, | ||
114 | { 0x18e118, 19 }, | ||
115 | { 0x18ff4b, 20 }, | ||
116 | { 0x190af1, 21 }, | ||
117 | { 0x191451, 22 }, | ||
118 | { 0xffffff, 23 }, | ||
119 | }; | ||
120 | |||
121 | /* QAM16 SNR lookup table */ | ||
122 | static const struct val_snr qam16_snr_lut[] = { | ||
123 | { 0x04f0d5, 0 }, | ||
124 | { 0x05387a, 1 }, | ||
125 | { 0x0573a4, 2 }, | ||
126 | { 0x05a99e, 3 }, | ||
127 | { 0x05cc80, 4 }, | ||
128 | { 0x05eb62, 5 }, | ||
129 | { 0x05fecf, 6 }, | ||
130 | { 0x060b80, 7 }, | ||
131 | { 0x062501, 8 }, | ||
132 | { 0x064865, 9 }, | ||
133 | { 0x069604, 10 }, | ||
134 | { 0x06f356, 11 }, | ||
135 | { 0x07706a, 12 }, | ||
136 | { 0x0804d3, 13 }, | ||
137 | { 0x089d1a, 14 }, | ||
138 | { 0x093e3d, 15 }, | ||
139 | { 0x09e35d, 16 }, | ||
140 | { 0x0a7c3c, 17 }, | ||
141 | { 0x0afaf8, 18 }, | ||
142 | { 0x0b719d, 19 }, | ||
143 | { 0x0bda6a, 20 }, | ||
144 | { 0x0c0c75, 21 }, | ||
145 | { 0x0c3f7d, 22 }, | ||
146 | { 0x0c5e62, 23 }, | ||
147 | { 0x0c6c31, 24 }, | ||
148 | { 0x0c7925, 25 }, | ||
149 | { 0xffffff, 26 }, | ||
150 | }; | ||
151 | |||
152 | /* QAM64 SNR lookup table */ | ||
153 | static const struct val_snr qam64_snr_lut[] = { | ||
154 | { 0x0256d0, 0 }, | ||
155 | { 0x027a65, 1 }, | ||
156 | { 0x029873, 2 }, | ||
157 | { 0x02b7fe, 3 }, | ||
158 | { 0x02cf1e, 4 }, | ||
159 | { 0x02e234, 5 }, | ||
160 | { 0x02f409, 6 }, | ||
161 | { 0x030046, 7 }, | ||
162 | { 0x030844, 8 }, | ||
163 | { 0x030a02, 9 }, | ||
164 | { 0x030cde, 10 }, | ||
165 | { 0x031031, 11 }, | ||
166 | { 0x03144c, 12 }, | ||
167 | { 0x0315dd, 13 }, | ||
168 | { 0x031920, 14 }, | ||
169 | { 0x0322d0, 15 }, | ||
170 | { 0x0339fc, 16 }, | ||
171 | { 0x0364a1, 17 }, | ||
172 | { 0x038bcc, 18 }, | ||
173 | { 0x03c7d3, 19 }, | ||
174 | { 0x0408cc, 20 }, | ||
175 | { 0x043bed, 21 }, | ||
176 | { 0x048061, 22 }, | ||
177 | { 0x04be95, 23 }, | ||
178 | { 0x04fa7d, 24 }, | ||
179 | { 0x052405, 25 }, | ||
180 | { 0x05570d, 26 }, | ||
181 | { 0x059feb, 27 }, | ||
182 | { 0x05bf38, 28 }, | ||
183 | { 0xffffff, 29 }, | ||
184 | }; | ||
185 | |||
88 | static const struct reg_val ofsm_init[] = { | 186 | static const struct reg_val ofsm_init[] = { |
89 | { 0x800051, 0x01 }, | 187 | { 0x800051, 0x01 }, |
90 | { 0x800070, 0x0a }, | 188 | { 0x800070, 0x0a }, |