aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/frontends
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2012-01-05 05:07:32 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-01-05 13:44:09 -0500
commitfa4b2a171d42ffc512b3a86922ad68e1355eb17a (patch)
tree868f8be726461ea7b39c22b2709800a8f8638283 /drivers/media/dvb/frontends
parent9348393aaf59948de8f9826e2e45337ebc3b94da (diff)
[media] drxk: create only one frontend for both DVB-C and DVB-T
Instead of creating two DVB frontend entries for the same device, create just one entry, and fill the delivery_system according with the supported standards. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/frontends')
-rw-r--r--drivers/media/dvb/frontends/drxk.h6
-rw-r--r--drivers/media/dvb/frontends/drxk_hard.c192
-rw-r--r--drivers/media/dvb/frontends/drxk_hard.h3
3 files changed, 84 insertions, 117 deletions
diff --git a/drivers/media/dvb/frontends/drxk.h b/drivers/media/dvb/frontends/drxk.h
index 870432ffcce1..020981844a86 100644
--- a/drivers/media/dvb/frontends/drxk.h
+++ b/drivers/media/dvb/frontends/drxk.h
@@ -37,12 +37,10 @@ struct drxk_config {
37#if defined(CONFIG_DVB_DRXK) || (defined(CONFIG_DVB_DRXK_MODULE) \ 37#if defined(CONFIG_DVB_DRXK) || (defined(CONFIG_DVB_DRXK_MODULE) \
38 && defined(MODULE)) 38 && defined(MODULE))
39extern struct dvb_frontend *drxk_attach(const struct drxk_config *config, 39extern struct dvb_frontend *drxk_attach(const struct drxk_config *config,
40 struct i2c_adapter *i2c, 40 struct i2c_adapter *i2c);
41 struct dvb_frontend **fe_t);
42#else 41#else
43static inline struct dvb_frontend *drxk_attach(const struct drxk_config *config, 42static inline struct dvb_frontend *drxk_attach(const struct drxk_config *config,
44 struct i2c_adapter *i2c, 43 struct i2c_adapter *i2c)
45 struct dvb_frontend **fe_t)
46{ 44{
47 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); 45 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
48 return NULL; 46 return NULL;
diff --git a/drivers/media/dvb/frontends/drxk_hard.c b/drivers/media/dvb/frontends/drxk_hard.c
index 77e78f459842..a95fb44cbba3 100644
--- a/drivers/media/dvb/frontends/drxk_hard.c
+++ b/drivers/media/dvb/frontends/drxk_hard.c
@@ -6174,7 +6174,7 @@ error:
6174 return status; 6174 return status;
6175} 6175}
6176 6176
6177static void drxk_c_release(struct dvb_frontend *fe) 6177static void drxk_release(struct dvb_frontend *fe)
6178{ 6178{
6179 struct drxk_state *state = fe->demodulator_priv; 6179 struct drxk_state *state = fe->demodulator_priv;
6180 6180
@@ -6182,21 +6182,7 @@ static void drxk_c_release(struct dvb_frontend *fe)
6182 kfree(state); 6182 kfree(state);
6183} 6183}
6184 6184
6185static int drxk_c_init(struct dvb_frontend *fe) 6185static int drxk_sleep(struct dvb_frontend *fe)
6186{
6187 struct drxk_state *state = fe->demodulator_priv;
6188
6189 dprintk(1, "\n");
6190 if (mutex_trylock(&state->ctlock) == 0)
6191 return -EBUSY;
6192 if (state->m_itut_annex_c)
6193 SetOperationMode(state, OM_QAM_ITU_C);
6194 else
6195 SetOperationMode(state, OM_QAM_ITU_A);
6196 return 0;
6197}
6198
6199static int drxk_c_sleep(struct dvb_frontend *fe)
6200{ 6186{
6201 struct drxk_state *state = fe->demodulator_priv; 6187 struct drxk_state *state = fe->demodulator_priv;
6202 6188
@@ -6229,24 +6215,36 @@ static int drxk_set_parameters(struct dvb_frontend *fe)
6229 return -EINVAL; 6215 return -EINVAL;
6230 } 6216 }
6231 6217
6218 if (fe->ops.i2c_gate_ctrl)
6219 fe->ops.i2c_gate_ctrl(fe, 1);
6220 if (fe->ops.tuner_ops.set_params)
6221 fe->ops.tuner_ops.set_params(fe);
6222 if (fe->ops.i2c_gate_ctrl)
6223 fe->ops.i2c_gate_ctrl(fe, 0);
6224 state->props = *p;
6225
6232 switch (delsys) { 6226 switch (delsys) {
6233 case SYS_DVBC_ANNEX_A: 6227 case SYS_DVBC_ANNEX_A:
6234 state->m_itut_annex_c = false;
6235 break;
6236 case SYS_DVBC_ANNEX_C: 6228 case SYS_DVBC_ANNEX_C:
6229 if (!state->m_hasDVBC)
6230 return -EINVAL;
6231 state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ? true : false;
6232 if (state->m_itut_annex_c)
6233 SetOperationMode(state, OM_QAM_ITU_C);
6234 else
6235 SetOperationMode(state, OM_QAM_ITU_A);
6236 break;
6237 state->m_itut_annex_c = true; 6237 state->m_itut_annex_c = true;
6238 break; 6238 break;
6239 case SYS_DVBT:
6240 if (!state->m_hasDVBT)
6241 return -EINVAL;
6242 SetOperationMode(state, OM_DVBT);
6243 break;
6239 default: 6244 default:
6240 return -EINVAL; 6245 return -EINVAL;
6241 } 6246 }
6242 6247
6243 if (fe->ops.i2c_gate_ctrl)
6244 fe->ops.i2c_gate_ctrl(fe, 1);
6245 if (fe->ops.tuner_ops.set_params)
6246 fe->ops.tuner_ops.set_params(fe);
6247 if (fe->ops.i2c_gate_ctrl)
6248 fe->ops.i2c_gate_ctrl(fe, 0);
6249 state->props = *p;
6250 fe->ops.tuner_ops.get_if_frequency(fe, &IF); 6248 fe->ops.tuner_ops.get_if_frequency(fe, &IF);
6251 Start(state, 0, IF); 6249 Start(state, 0, IF);
6252 6250
@@ -6314,91 +6312,54 @@ static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6314 return 0; 6312 return 0;
6315} 6313}
6316 6314
6317static int drxk_c_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings 6315static int drxk_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6318 *sets) 6316 *sets)
6319{ 6317{
6320 dprintk(1, "\n"); 6318 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6321 sets->min_delay_ms = 3000;
6322 sets->max_drift = 0;
6323 sets->step_size = 0;
6324 return 0;
6325}
6326
6327static void drxk_t_release(struct dvb_frontend *fe)
6328{
6329 /*
6330 * There's nothing to release here, as the state struct
6331 * is already freed by drxk_c_release.
6332 */
6333}
6334
6335static int drxk_t_init(struct dvb_frontend *fe)
6336{
6337 struct drxk_state *state = fe->demodulator_priv;
6338
6339 dprintk(1, "\n");
6340 if (mutex_trylock(&state->ctlock) == 0)
6341 return -EBUSY;
6342 SetOperationMode(state, OM_DVBT);
6343 return 0;
6344}
6345
6346static int drxk_t_sleep(struct dvb_frontend *fe)
6347{
6348 struct drxk_state *state = fe->demodulator_priv;
6349 6319
6350 dprintk(1, "\n"); 6320 dprintk(1, "\n");
6351 mutex_unlock(&state->ctlock); 6321 switch (p->delivery_system) {
6352 return 0; 6322 case SYS_DVBC_ANNEX_A:
6323 case SYS_DVBC_ANNEX_C:
6324 sets->min_delay_ms = 3000;
6325 sets->max_drift = 0;
6326 sets->step_size = 0;
6327 return 0;
6328 default:
6329 /*
6330 * For DVB-T, let it use the default DVB core way, that is:
6331 * fepriv->step_size = fe->ops.info.frequency_stepsize * 2
6332 */
6333 return -EINVAL;
6334 }
6353} 6335}
6354 6336
6355static struct dvb_frontend_ops drxk_c_ops = { 6337static struct dvb_frontend_ops drxk_ops = {
6356 .delsys = { SYS_DVBC_ANNEX_A, SYS_DVBC_ANNEX_C }, 6338 /* .delsys will be filled dynamically */
6357 .info = {
6358 .name = "DRXK DVB-C",
6359 .frequency_min = 47000000,
6360 .frequency_max = 862000000,
6361 .symbol_rate_min = 870000,
6362 .symbol_rate_max = 11700000,
6363 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6364 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO},
6365 .release = drxk_c_release,
6366 .init = drxk_c_init,
6367 .sleep = drxk_c_sleep,
6368 .i2c_gate_ctrl = drxk_gate_ctrl,
6369
6370 .set_frontend = drxk_set_parameters,
6371 .get_tune_settings = drxk_c_get_tune_settings,
6372
6373 .read_status = drxk_read_status,
6374 .read_ber = drxk_read_ber,
6375 .read_signal_strength = drxk_read_signal_strength,
6376 .read_snr = drxk_read_snr,
6377 .read_ucblocks = drxk_read_ucblocks,
6378};
6379
6380static struct dvb_frontend_ops drxk_t_ops = {
6381 .delsys = { SYS_DVBT },
6382 .info = { 6339 .info = {
6383 .name = "DRXK DVB-T", 6340 .name = "DRXK",
6384 .frequency_min = 47125000, 6341 .frequency_min = 47000000,
6385 .frequency_max = 865000000, 6342 .frequency_max = 865000000,
6386 .frequency_stepsize = 166667, 6343 /* For DVB-C */
6387 .frequency_tolerance = 0, 6344 .symbol_rate_min = 870000,
6388 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | 6345 .symbol_rate_max = 11700000,
6389 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | 6346 /* For DVB-T */
6390 FE_CAN_FEC_AUTO | 6347 .frequency_stepsize = 166667,
6391 FE_CAN_QAM_16 | FE_CAN_QAM_64 | 6348
6392 FE_CAN_QAM_AUTO | 6349 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6393 FE_CAN_TRANSMISSION_MODE_AUTO | 6350 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO |
6394 FE_CAN_GUARD_INTERVAL_AUTO | 6351 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
6395 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_MUTE_TS}, 6352 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_MUTE_TS |
6396 .release = drxk_t_release, 6353 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
6397 .init = drxk_t_init, 6354 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO
6398 .sleep = drxk_t_sleep, 6355 },
6356
6357 .release = drxk_release,
6358 .sleep = drxk_sleep,
6399 .i2c_gate_ctrl = drxk_gate_ctrl, 6359 .i2c_gate_ctrl = drxk_gate_ctrl,
6400 6360
6401 .set_frontend = drxk_set_parameters, 6361 .set_frontend = drxk_set_parameters,
6362 .get_tune_settings = drxk_get_tune_settings,
6402 6363
6403 .read_status = drxk_read_status, 6364 .read_status = drxk_read_status,
6404 .read_ber = drxk_read_ber, 6365 .read_ber = drxk_read_ber,
@@ -6408,9 +6369,10 @@ static struct dvb_frontend_ops drxk_t_ops = {
6408}; 6369};
6409 6370
6410struct dvb_frontend *drxk_attach(const struct drxk_config *config, 6371struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6411 struct i2c_adapter *i2c, 6372 struct i2c_adapter *i2c)
6412 struct dvb_frontend **fe_t)
6413{ 6373{
6374 int n;
6375
6414 struct drxk_state *state = NULL; 6376 struct drxk_state *state = NULL;
6415 u8 adr = config->adr; 6377 u8 adr = config->adr;
6416 6378
@@ -6445,21 +6407,29 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6445 mutex_init(&state->mutex); 6407 mutex_init(&state->mutex);
6446 mutex_init(&state->ctlock); 6408 mutex_init(&state->ctlock);
6447 6409
6448 memcpy(&state->c_frontend.ops, &drxk_c_ops, 6410 memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops));
6449 sizeof(struct dvb_frontend_ops)); 6411 state->frontend.demodulator_priv = state;
6450 memcpy(&state->t_frontend.ops, &drxk_t_ops,
6451 sizeof(struct dvb_frontend_ops));
6452 state->c_frontend.demodulator_priv = state;
6453 state->t_frontend.demodulator_priv = state;
6454 6412
6455 init_state(state); 6413 init_state(state);
6456 if (init_drxk(state) < 0) 6414 if (init_drxk(state) < 0)
6457 goto error; 6415 goto error;
6458 *fe_t = &state->t_frontend;
6459 6416
6460 printk(KERN_INFO "drxk: frontend initialized.\n"); 6417 /* Initialize the supported delivery systems */
6418 n = 0;
6419 if (state->m_hasDVBC) {
6420 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_A;
6421 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_C;
6422 strlcat(state->frontend.ops.info.name, " DVB-C",
6423 sizeof(state->frontend.ops.info.name));
6424 }
6425 if (state->m_hasDVBT) {
6426 state->frontend.ops.delsys[n++] = SYS_DVBT;
6427 strlcat(state->frontend.ops.info.name, " DVB-T",
6428 sizeof(state->frontend.ops.info.name));
6429 }
6461 6430
6462 return &state->c_frontend; 6431 printk(KERN_INFO "drxk: frontend initialized.\n");
6432 return &state->frontend;
6463 6433
6464error: 6434error:
6465 printk(KERN_ERR "drxk: not found\n"); 6435 printk(KERN_ERR "drxk: not found\n");
diff --git a/drivers/media/dvb/frontends/drxk_hard.h b/drivers/media/dvb/frontends/drxk_hard.h
index 60bcd6119114..7e3e4cf8d2f3 100644
--- a/drivers/media/dvb/frontends/drxk_hard.h
+++ b/drivers/media/dvb/frontends/drxk_hard.h
@@ -195,8 +195,7 @@ struct DRXKOfdmScCmd_t {
195}; 195};
196 196
197struct drxk_state { 197struct drxk_state {
198 struct dvb_frontend c_frontend; 198 struct dvb_frontend frontend;
199 struct dvb_frontend t_frontend;
200 struct dtv_frontend_properties props; 199 struct dtv_frontend_properties props;
201 struct device *dev; 200 struct device *dev;
202 201