diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-01-05 05:07:32 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-01-05 13:44:09 -0500 |
commit | fa4b2a171d42ffc512b3a86922ad68e1355eb17a (patch) | |
tree | 868f8be726461ea7b39c22b2709800a8f8638283 /drivers/media/dvb/frontends | |
parent | 9348393aaf59948de8f9826e2e45337ebc3b94da (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.h | 6 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/drxk_hard.c | 192 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/drxk_hard.h | 3 |
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)) |
39 | extern struct dvb_frontend *drxk_attach(const struct drxk_config *config, | 39 | extern 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 |
43 | static inline struct dvb_frontend *drxk_attach(const struct drxk_config *config, | 42 | static 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 | ||
6177 | static void drxk_c_release(struct dvb_frontend *fe) | 6177 | static 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 | ||
6185 | static int drxk_c_init(struct dvb_frontend *fe) | 6185 | static 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 | |||
6199 | static 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 | ||
6317 | static int drxk_c_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings | 6315 | static 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 | |||
6327 | static 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 | |||
6335 | static 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 | |||
6346 | static 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 | ||
6355 | static struct dvb_frontend_ops drxk_c_ops = { | 6337 | static 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 | |||
6380 | static 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 | ||
6410 | struct dvb_frontend *drxk_attach(const struct drxk_config *config, | 6371 | struct 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 | ||
6464 | error: | 6434 | error: |
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 | ||
197 | struct drxk_state { | 197 | struct 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 | ||