aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/pci/pt1/pt1.c')
-rw-r--r--drivers/media/pci/pt1/pt1.c54
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] = {
200static int config_demod(struct i2c_client *cl, enum pt1_fe_clk clk) 200static 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 */
263static 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
263static void pt1_write_reg(struct pt1 *pt1, int reg, u32 data) 297static 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
992tuner_release: 1030tuner_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