aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <m.chehab@samsung.com>2014-08-09 20:47:19 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-08-21 16:25:09 -0400
commit59d7889ae49f6e3e9d9cff8c0de7ad95d9ca068b (patch)
treeba67f1e8e6825e9f7108c5a8a55e380602fa97af
parent811872404bb021b73ecb4b78de88bd2d7f26548e (diff)
[media] dvb-frontend: add core support for tuner suspend/resume
While several tuners have some sort of suspend/resume implementation, this is currently mangled with an optional .sleep callback that it is also used to put the device on low power mode. Not all drivers implement it, as returning the driver from low power may require to re-load the firmware, with takes some time. Also, some drivers may delay it. So, the more coherent is to add two new optional callbacks that will let the tuners to directy implement suspend and resume callbacks if they need. Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/media/dvb-core/dvb_frontend.c8
-rw-r--r--drivers/media/dvb-core/dvb_frontend.h2
-rw-r--r--drivers/media/v4l2-core/tuner-core.c8
3 files changed, 14 insertions, 4 deletions
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index c2a6a0a85813..a5810391af61 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -2550,7 +2550,9 @@ int dvb_frontend_suspend(struct dvb_frontend *fe)
2550 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num, 2550 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2551 fe->id); 2551 fe->id);
2552 2552
2553 if (fe->ops.tuner_ops.sleep) 2553 if (fe->ops.tuner_ops.suspend)
2554 ret = fe->ops.tuner_ops.suspend(fe);
2555 else if (fe->ops.tuner_ops.sleep)
2554 ret = fe->ops.tuner_ops.sleep(fe); 2556 ret = fe->ops.tuner_ops.sleep(fe);
2555 2557
2556 if (fe->ops.sleep) 2558 if (fe->ops.sleep)
@@ -2572,7 +2574,9 @@ int dvb_frontend_resume(struct dvb_frontend *fe)
2572 if (fe->ops.init) 2574 if (fe->ops.init)
2573 ret = fe->ops.init(fe); 2575 ret = fe->ops.init(fe);
2574 2576
2575 if (fe->ops.tuner_ops.init) 2577 if (fe->ops.tuner_ops.resume)
2578 ret = fe->ops.tuner_ops.resume(fe);
2579 else if (fe->ops.tuner_ops.init)
2576 ret = fe->ops.tuner_ops.init(fe); 2580 ret = fe->ops.tuner_ops.init(fe);
2577 2581
2578 fe->exit = DVB_FE_NO_EXIT; 2582 fe->exit = DVB_FE_NO_EXIT;
diff --git a/drivers/media/dvb-core/dvb_frontend.h b/drivers/media/dvb-core/dvb_frontend.h
index d398de4b6ef4..816269e5f706 100644
--- a/drivers/media/dvb-core/dvb_frontend.h
+++ b/drivers/media/dvb-core/dvb_frontend.h
@@ -201,6 +201,8 @@ struct dvb_tuner_ops {
201 int (*release)(struct dvb_frontend *fe); 201 int (*release)(struct dvb_frontend *fe);
202 int (*init)(struct dvb_frontend *fe); 202 int (*init)(struct dvb_frontend *fe);
203 int (*sleep)(struct dvb_frontend *fe); 203 int (*sleep)(struct dvb_frontend *fe);
204 int (*suspend)(struct dvb_frontend *fe);
205 int (*resume)(struct dvb_frontend *fe);
204 206
205 /** This is for simple PLLs - set all parameters in one go. */ 207 /** This is for simple PLLs - set all parameters in one go. */
206 int (*set_params)(struct dvb_frontend *fe); 208 int (*set_params)(struct dvb_frontend *fe);
diff --git a/drivers/media/v4l2-core/tuner-core.c b/drivers/media/v4l2-core/tuner-core.c
index 06c18ba16fa0..177023200737 100644
--- a/drivers/media/v4l2-core/tuner-core.c
+++ b/drivers/media/v4l2-core/tuner-core.c
@@ -1260,7 +1260,9 @@ static int tuner_suspend(struct device *dev)
1260 1260
1261 tuner_dbg("suspend\n"); 1261 tuner_dbg("suspend\n");
1262 1262
1263 if (!t->standby && analog_ops->standby) 1263 if (t->fe.ops.tuner_ops.suspend)
1264 t->fe.ops.tuner_ops.suspend(&t->fe);
1265 else if (!t->standby && analog_ops->standby)
1264 analog_ops->standby(&t->fe); 1266 analog_ops->standby(&t->fe);
1265 1267
1266 return 0; 1268 return 0;
@@ -1273,7 +1275,9 @@ static int tuner_resume(struct device *dev)
1273 1275
1274 tuner_dbg("resume\n"); 1276 tuner_dbg("resume\n");
1275 1277
1276 if (!t->standby) 1278 if (t->fe.ops.tuner_ops.resume)
1279 t->fe.ops.tuner_ops.resume(&t->fe);
1280 else if (!t->standby)
1277 if (set_mode(t, t->mode) == 0) 1281 if (set_mode(t, t->mode) == 0)
1278 set_freq(t, 0); 1282 set_freq(t, 0);
1279 1283