diff options
Diffstat (limited to 'drivers/media/pci/pt1/pt1.c')
-rw-r--r-- | drivers/media/pci/pt1/pt1.c | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/drivers/media/pci/pt1/pt1.c b/drivers/media/pci/pt1/pt1.c index 7f878fc41b7e..93fecffb36ee 100644 --- a/drivers/media/pci/pt1/pt1.c +++ b/drivers/media/pci/pt1/pt1.c | |||
@@ -200,16 +200,10 @@ static const u8 va1j5jf8007t_25mhz_configs[][2] = { | |||
200 | static int config_demod(struct i2c_client *cl, enum pt1_fe_clk clk) | 200 | static int config_demod(struct i2c_client *cl, enum pt1_fe_clk clk) |
201 | { | 201 | { |
202 | int ret; | 202 | int ret; |
203 | u8 buf[2] = {0x01, 0x80}; | ||
204 | bool is_sat; | 203 | bool is_sat; |
205 | const u8 (*cfg_data)[2]; | 204 | const u8 (*cfg_data)[2]; |
206 | int i, len; | 205 | int i, len; |
207 | 206 | ||
208 | ret = i2c_master_send(cl, buf, 2); | ||
209 | if (ret < 0) | ||
210 | return ret; | ||
211 | usleep_range(30000, 50000); | ||
212 | |||
213 | is_sat = !strncmp(cl->name, TC90522_I2C_DEV_SAT, | 207 | is_sat = !strncmp(cl->name, TC90522_I2C_DEV_SAT, |
214 | strlen(TC90522_I2C_DEV_SAT)); | 208 | strlen(TC90522_I2C_DEV_SAT)); |
215 | if (is_sat) { | 209 | if (is_sat) { |
@@ -260,6 +254,46 @@ static int config_demod(struct i2c_client *cl, enum pt1_fe_clk clk) | |||
260 | return 0; | 254 | return 0; |
261 | } | 255 | } |
262 | 256 | ||
257 | /* | ||
258 | * Init registers for (each pair of) terrestrial/satellite block in demod. | ||
259 | * Note that resetting terr. block also resets its peer sat. block as well. | ||
260 | * This function must be called before configuring any demod block | ||
261 | * (before pt1_wakeup(), fe->ops.init()). | ||
262 | */ | ||
263 | static int pt1_demod_block_init(struct pt1 *pt1) | ||
264 | { | ||
265 | struct i2c_client *cl; | ||
266 | u8 buf[2] = {0x01, 0x80}; | ||
267 | int ret; | ||
268 | int i; | ||
269 | |||
270 | /* reset all terr. & sat. pairs first */ | ||
271 | for (i = 0; i < PT1_NR_ADAPS; i++) { | ||
272 | cl = pt1->adaps[i]->demod_i2c_client; | ||
273 | if (strncmp(cl->name, TC90522_I2C_DEV_TER, | ||
274 | strlen(TC90522_I2C_DEV_TER))) | ||
275 | continue; | ||
276 | |||
277 | ret = i2c_master_send(cl, buf, 2); | ||
278 | if (ret < 0) | ||
279 | return ret; | ||
280 | usleep_range(30000, 50000); | ||
281 | } | ||
282 | |||
283 | for (i = 0; i < PT1_NR_ADAPS; i++) { | ||
284 | cl = pt1->adaps[i]->demod_i2c_client; | ||
285 | if (strncmp(cl->name, TC90522_I2C_DEV_SAT, | ||
286 | strlen(TC90522_I2C_DEV_SAT))) | ||
287 | continue; | ||
288 | |||
289 | ret = i2c_master_send(cl, buf, 2); | ||
290 | if (ret < 0) | ||
291 | return ret; | ||
292 | usleep_range(30000, 50000); | ||
293 | } | ||
294 | return 0; | ||
295 | } | ||
296 | |||
263 | static void pt1_write_reg(struct pt1 *pt1, int reg, u32 data) | 297 | static void pt1_write_reg(struct pt1 *pt1, int reg, u32 data) |
264 | { | 298 | { |
265 | writel(data, pt1->regs + reg * 4); | 299 | writel(data, pt1->regs + reg * 4); |
@@ -987,6 +1021,10 @@ static int pt1_init_frontends(struct pt1 *pt1) | |||
987 | goto tuner_release; | 1021 | goto tuner_release; |
988 | } | 1022 | } |
989 | 1023 | ||
1024 | ret = pt1_demod_block_init(pt1); | ||
1025 | if (ret < 0) | ||
1026 | goto fe_unregister; | ||
1027 | |||
990 | return 0; | 1028 | return 0; |
991 | 1029 | ||
992 | tuner_release: | 1030 | tuner_release: |
@@ -1245,6 +1283,10 @@ static int pt1_resume(struct device *dev) | |||
1245 | pt1_update_power(pt1); | 1283 | pt1_update_power(pt1); |
1246 | usleep_range(1000, 2000); | 1284 | usleep_range(1000, 2000); |
1247 | 1285 | ||
1286 | ret = pt1_demod_block_init(pt1); | ||
1287 | if (ret < 0) | ||
1288 | goto resume_err; | ||
1289 | |||
1248 | for (i = 0; i < PT1_NR_ADAPS; i++) | 1290 | for (i = 0; i < PT1_NR_ADAPS; i++) |
1249 | dvb_frontend_reinitialise(pt1->adaps[i]->fe); | 1291 | dvb_frontend_reinitialise(pt1->adaps[i]->fe); |
1250 | 1292 | ||