aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShuah Khan <shuah.kh@samsung.com>2014-07-24 12:02:15 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-26 10:22:05 -0400
commit998819d2715eb765ba3752294bd694c3b06eaa04 (patch)
tree2b7ce3dfb83878f2e017daba6b347f4af23aee8a
parent87cd0fa8114df9fa4ac6535d16b6e3b37ebb6230 (diff)
[media] media: drx39xyj - add resume support
drx39xyj driver lacks resume support. Add support by changing its fe ops init interface to detect the resume status by checking fe exit flag and do the necessary initialization. With this change, driver resume correctly in both dvb adapter is not in use and in use by an application cases. Signed-off-by: Shuah Khan <shuah.kh@samsung.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/media/dvb-frontends/drx39xyj/drxj.c65
1 files changed, 42 insertions, 23 deletions
diff --git a/drivers/media/dvb-frontends/drx39xyj/drxj.c b/drivers/media/dvb-frontends/drx39xyj/drxj.c
index 7007e0b507c0..4712399847a3 100644
--- a/drivers/media/dvb-frontends/drx39xyj/drxj.c
+++ b/drivers/media/dvb-frontends/drx39xyj/drxj.c
@@ -11315,6 +11315,7 @@ rw_error:
11315static int drx_ctrl_u_code(struct drx_demod_instance *demod, 11315static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11316 struct drxu_code_info *mc_info, 11316 struct drxu_code_info *mc_info,
11317 enum drxu_code_action action); 11317 enum drxu_code_action action);
11318static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state);
11318 11319
11319/** 11320/**
11320* \fn drxj_open() 11321* \fn drxj_open()
@@ -11527,6 +11528,7 @@ static int drxj_open(struct drx_demod_instance *demod)
11527 ext_attr->aud_data = drxj_default_aud_data_g; 11528 ext_attr->aud_data = drxj_default_aud_data_g;
11528 11529
11529 demod->my_common_attr->is_opened = true; 11530 demod->my_common_attr->is_opened = true;
11531 drxj_set_lna_state(demod, false);
11530 return 0; 11532 return 0;
11531rw_error: 11533rw_error:
11532 common_attr->is_opened = false; 11534 common_attr->is_opened = false;
@@ -11890,6 +11892,33 @@ release:
11890 return rc; 11892 return rc;
11891} 11893}
11892 11894
11895/* caller is expeced to check if lna is supported before enabling */
11896static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state)
11897{
11898 struct drxuio_cfg uio_cfg;
11899 struct drxuio_data uio_data;
11900 int result;
11901
11902 uio_cfg.uio = DRX_UIO1;
11903 uio_cfg.mode = DRX_UIO_MODE_READWRITE;
11904 /* Configure user-I/O #3: enable read/write */
11905 result = ctrl_set_uio_cfg(demod, &uio_cfg);
11906 if (result) {
11907 pr_err("Failed to setup LNA GPIO!\n");
11908 return result;
11909 }
11910
11911 uio_data.uio = DRX_UIO1;
11912 uio_data.value = state;
11913 result = ctrl_uio_write(demod, &uio_data);
11914 if (result != 0) {
11915 pr_err("Failed to %sable LNA!\n",
11916 state ? "en" : "dis");
11917 return result;
11918 }
11919 return 0;
11920}
11921
11893/* 11922/*
11894 * The Linux DVB Driver for Micronas DRX39xx family (drx3933j) 11923 * The Linux DVB Driver for Micronas DRX39xx family (drx3933j)
11895 * 11924 *
@@ -12180,10 +12209,20 @@ static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
12180 12209
12181static int drx39xxj_init(struct dvb_frontend *fe) 12210static int drx39xxj_init(struct dvb_frontend *fe)
12182{ 12211{
12183 /* Bring the demod out of sleep */ 12212 struct drx39xxj_state *state = fe->demodulator_priv;
12184 drx39xxj_set_powerstate(fe, 1); 12213 struct drx_demod_instance *demod = state->demod;
12214 int rc = 0;
12185 12215
12186 return 0; 12216 if (fe->exit == DVB_FE_DEVICE_RESUME) {
12217 /* so drxj_open() does what it needs to do */
12218 demod->my_common_attr->is_opened = false;
12219 rc = drxj_open(demod);
12220 if (rc != 0)
12221 pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc);
12222 } else
12223 drx39xxj_set_powerstate(fe, 1);
12224
12225 return rc;
12187} 12226}
12188 12227
12189static int drx39xxj_set_lna(struct dvb_frontend *fe) 12228static int drx39xxj_set_lna(struct dvb_frontend *fe)
@@ -12261,8 +12300,6 @@ struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
12261 struct drxj_data *demod_ext_attr = NULL; 12300 struct drxj_data *demod_ext_attr = NULL;
12262 struct drx_demod_instance *demod = NULL; 12301 struct drx_demod_instance *demod = NULL;
12263 struct dtv_frontend_properties *p; 12302 struct dtv_frontend_properties *p;
12264 struct drxuio_cfg uio_cfg;
12265 struct drxuio_data uio_data;
12266 int result; 12303 int result;
12267 12304
12268 /* allocate memory for the internal state */ 12305 /* allocate memory for the internal state */
@@ -12313,24 +12350,6 @@ struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
12313 goto error; 12350 goto error;
12314 } 12351 }
12315 12352
12316 /* Turn off the LNA */
12317 uio_cfg.uio = DRX_UIO1;
12318 uio_cfg.mode = DRX_UIO_MODE_READWRITE;
12319 /* Configure user-I/O #3: enable read/write */
12320 result = ctrl_set_uio_cfg(demod, &uio_cfg);
12321 if (result) {
12322 pr_err("Failed to setup LNA GPIO!\n");
12323 goto error;
12324 }
12325
12326 uio_data.uio = DRX_UIO1;
12327 uio_data.value = false;
12328 result = ctrl_uio_write(demod, &uio_data);
12329 if (result != 0) {
12330 pr_err("Failed to disable LNA!\n");
12331 goto error;
12332 }
12333
12334 /* create dvb_frontend */ 12353 /* create dvb_frontend */
12335 memcpy(&state->frontend.ops, &drx39xxj_ops, 12354 memcpy(&state->frontend.ops, &drx39xxj_ops,
12336 sizeof(struct dvb_frontend_ops)); 12355 sizeof(struct dvb_frontend_ops));