aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/dvb-frontends/m88rs2000.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/drivers/media/dvb-frontends/m88rs2000.c b/drivers/media/dvb-frontends/m88rs2000.c
index 8091653e8864..02699c111019 100644
--- a/drivers/media/dvb-frontends/m88rs2000.c
+++ b/drivers/media/dvb-frontends/m88rs2000.c
@@ -160,24 +160,44 @@ static int m88rs2000_set_symbolrate(struct dvb_frontend *fe, u32 srate)
160{ 160{
161 struct m88rs2000_state *state = fe->demodulator_priv; 161 struct m88rs2000_state *state = fe->demodulator_priv;
162 int ret; 162 int ret;
163 u32 temp; 163 u64 temp;
164 u32 mclk;
164 u8 b[3]; 165 u8 b[3];
165 166
166 if ((srate < 1000000) || (srate > 45000000)) 167 if ((srate < 1000000) || (srate > 45000000))
167 return -EINVAL; 168 return -EINVAL;
168 169
170 mclk = m88rs2000_get_mclk(fe);
171 if (!mclk)
172 return -EINVAL;
173
169 temp = srate / 1000; 174 temp = srate / 1000;
170 temp *= 11831; 175 temp *= 1 << 24;
171 temp /= 68; 176
172 temp -= 3; 177 do_div(temp, mclk);
173 178
174 b[0] = (u8) (temp >> 16) & 0xff; 179 b[0] = (u8) (temp >> 16) & 0xff;
175 b[1] = (u8) (temp >> 8) & 0xff; 180 b[1] = (u8) (temp >> 8) & 0xff;
176 b[2] = (u8) temp & 0xff; 181 b[2] = (u8) temp & 0xff;
182
177 ret = m88rs2000_writereg(state, 0x93, b[2]); 183 ret = m88rs2000_writereg(state, 0x93, b[2]);
178 ret |= m88rs2000_writereg(state, 0x94, b[1]); 184 ret |= m88rs2000_writereg(state, 0x94, b[1]);
179 ret |= m88rs2000_writereg(state, 0x95, b[0]); 185 ret |= m88rs2000_writereg(state, 0x95, b[0]);
180 186
187 if (srate > 10000000)
188 ret |= m88rs2000_writereg(state, 0xa0, 0x20);
189 else
190 ret |= m88rs2000_writereg(state, 0xa0, 0x60);
191
192 ret |= m88rs2000_writereg(state, 0xa1, 0xe0);
193
194 if (srate > 12000000)
195 ret |= m88rs2000_writereg(state, 0xa3, 0x20);
196 else if (srate > 2800000)
197 ret |= m88rs2000_writereg(state, 0xa3, 0x98);
198 else
199 ret |= m88rs2000_writereg(state, 0xa3, 0x90);
200
181 deb_info("m88rs2000: m88rs2000_set_symbolrate\n"); 201 deb_info("m88rs2000: m88rs2000_set_symbolrate\n");
182 return ret; 202 return ret;
183} 203}
@@ -307,8 +327,6 @@ struct inittab m88rs2000_shutdown[] = {
307 327
308struct inittab fe_reset[] = { 328struct inittab fe_reset[] = {
309 {DEMOD_WRITE, 0x00, 0x01}, 329 {DEMOD_WRITE, 0x00, 0x01},
310 {DEMOD_WRITE, 0xf1, 0xbf},
311 {DEMOD_WRITE, 0x00, 0x01},
312 {DEMOD_WRITE, 0x20, 0x81}, 330 {DEMOD_WRITE, 0x20, 0x81},
313 {DEMOD_WRITE, 0x21, 0x80}, 331 {DEMOD_WRITE, 0x21, 0x80},
314 {DEMOD_WRITE, 0x10, 0x33}, 332 {DEMOD_WRITE, 0x10, 0x33},
@@ -351,9 +369,6 @@ struct inittab fe_trigger[] = {
351 {DEMOD_WRITE, 0x9b, 0x64}, 369 {DEMOD_WRITE, 0x9b, 0x64},
352 {DEMOD_WRITE, 0x9e, 0x00}, 370 {DEMOD_WRITE, 0x9e, 0x00},
353 {DEMOD_WRITE, 0x9f, 0xf8}, 371 {DEMOD_WRITE, 0x9f, 0xf8},
354 {DEMOD_WRITE, 0xa0, 0x20},
355 {DEMOD_WRITE, 0xa1, 0xe0},
356 {DEMOD_WRITE, 0xa3, 0x38},
357 {DEMOD_WRITE, 0x98, 0xff}, 372 {DEMOD_WRITE, 0x98, 0xff},
358 {DEMOD_WRITE, 0xc0, 0x0f}, 373 {DEMOD_WRITE, 0xc0, 0x0f},
359 {DEMOD_WRITE, 0x89, 0x01}, 374 {DEMOD_WRITE, 0x89, 0x01},
@@ -625,8 +640,13 @@ static int m88rs2000_set_frontend(struct dvb_frontend *fe)
625 if (ret < 0) 640 if (ret < 0)
626 return -ENODEV; 641 return -ENODEV;
627 642
628 /* Reset Demod */ 643 /* Reset demod by symbol rate */
629 ret = m88rs2000_tab_set(state, fe_reset); 644 if (c->symbol_rate > 27500000)
645 ret = m88rs2000_writereg(state, 0xf1, 0xa4);
646 else
647 ret = m88rs2000_writereg(state, 0xf1, 0xbf);
648
649 ret |= m88rs2000_tab_set(state, fe_reset);
630 if (ret < 0) 650 if (ret < 0)
631 return -ENODEV; 651 return -ENODEV;
632 652