Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

+90 -147
+1 -1
drivers/media/dvb/ddbridge/ddbridge-core.c
··· 580 580 memset(&config, 0, sizeof(config)); 581 581 config.adr = 0x29 + (input->nr & 1); 582 582 583 - fe = input->fe = dvb_attach(drxk_attach, &config, i2c, &input->fe2); 583 + fe = input->fe = dvb_attach(drxk_attach, &config, i2c); 584 584 if (!input->fe) { 585 585 printk(KERN_ERR "No DRXK found!\n"); 586 586 return -ENODEV;
+2 -4
drivers/media/dvb/frontends/drxk.h
··· 37 37 #if defined(CONFIG_DVB_DRXK) || (defined(CONFIG_DVB_DRXK_MODULE) \ 38 38 && defined(MODULE)) 39 39 extern struct dvb_frontend *drxk_attach(const struct drxk_config *config, 40 - struct i2c_adapter *i2c, 41 - struct dvb_frontend **fe_t); 40 + struct i2c_adapter *i2c); 42 41 #else 43 42 static inline struct dvb_frontend *drxk_attach(const struct drxk_config *config, 44 - struct i2c_adapter *i2c, 45 - struct dvb_frontend **fe_t) 43 + struct i2c_adapter *i2c) 46 44 { 47 45 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); 48 46 return NULL;
+83 -113
drivers/media/dvb/frontends/drxk_hard.c
··· 6174 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 6179 struct drxk_state *state = fe->demodulator_priv; 6180 6180 ··· 6182 6182 kfree(state); 6183 6183 } 6184 6184 6185 - static int drxk_c_init(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) 6185 + static int drxk_sleep(struct dvb_frontend *fe) 6200 6186 { 6201 6187 struct drxk_state *state = fe->demodulator_priv; 6202 6188 ··· 6215 6229 return -EINVAL; 6216 6230 } 6217 6231 6218 - switch (delsys) { 6219 - case SYS_DVBC_ANNEX_A: 6220 - state->m_itut_annex_c = false; 6221 - break; 6222 - case SYS_DVBC_ANNEX_C: 6223 - state->m_itut_annex_c = true; 6224 - break; 6225 - default: 6226 - return -EINVAL; 6227 - } 6228 - 6229 6232 if (fe->ops.i2c_gate_ctrl) 6230 6233 fe->ops.i2c_gate_ctrl(fe, 1); 6231 6234 if (fe->ops.tuner_ops.set_params) ··· 6222 6247 if (fe->ops.i2c_gate_ctrl) 6223 6248 fe->ops.i2c_gate_ctrl(fe, 0); 6224 6249 state->props = *p; 6250 + 6251 + switch (delsys) { 6252 + case SYS_DVBC_ANNEX_A: 6253 + case SYS_DVBC_ANNEX_C: 6254 + if (!state->m_hasDVBC) 6255 + return -EINVAL; 6256 + state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ? true : false; 6257 + if (state->m_itut_annex_c) 6258 + SetOperationMode(state, OM_QAM_ITU_C); 6259 + else 6260 + SetOperationMode(state, OM_QAM_ITU_A); 6261 + break; 6262 + state->m_itut_annex_c = true; 6263 + break; 6264 + case SYS_DVBT: 6265 + if (!state->m_hasDVBT) 6266 + return -EINVAL; 6267 + SetOperationMode(state, OM_DVBT); 6268 + break; 6269 + default: 6270 + return -EINVAL; 6271 + } 6272 + 6225 6273 fe->ops.tuner_ops.get_if_frequency(fe, &IF); 6226 6274 Start(state, 0, IF); 6227 6275 ··· 6312 6314 return 0; 6313 6315 } 6314 6316 6315 - static int drxk_c_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings 6317 + static int drxk_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings 6316 6318 *sets) 6317 6319 { 6318 - dprintk(1, "\n"); 6319 - sets->min_delay_ms = 3000; 6320 - sets->max_drift = 0; 6321 - sets->step_size = 0; 6322 - return 0; 6323 - } 6324 - 6325 - static void drxk_t_release(struct dvb_frontend *fe) 6326 - { 6327 - /* 6328 - * There's nothing to release here, as the state struct 6329 - * is already freed by drxk_c_release. 6330 - */ 6331 - } 6332 - 6333 - static int drxk_t_init(struct dvb_frontend *fe) 6334 - { 6335 - struct drxk_state *state = fe->demodulator_priv; 6320 + struct dtv_frontend_properties *p = &fe->dtv_property_cache; 6336 6321 6337 6322 dprintk(1, "\n"); 6338 - if (mutex_trylock(&state->ctlock) == 0) 6339 - return -EBUSY; 6340 - SetOperationMode(state, OM_DVBT); 6341 - return 0; 6323 + switch (p->delivery_system) { 6324 + case SYS_DVBC_ANNEX_A: 6325 + case SYS_DVBC_ANNEX_C: 6326 + sets->min_delay_ms = 3000; 6327 + sets->max_drift = 0; 6328 + sets->step_size = 0; 6329 + return 0; 6330 + default: 6331 + /* 6332 + * For DVB-T, let it use the default DVB core way, that is: 6333 + * fepriv->step_size = fe->ops.info.frequency_stepsize * 2 6334 + */ 6335 + return -EINVAL; 6336 + } 6342 6337 } 6343 6338 6344 - static int drxk_t_sleep(struct dvb_frontend *fe) 6345 - { 6346 - struct drxk_state *state = fe->demodulator_priv; 6347 - 6348 - dprintk(1, "\n"); 6349 - mutex_unlock(&state->ctlock); 6350 - return 0; 6351 - } 6352 - 6353 - static struct dvb_frontend_ops drxk_c_ops = { 6354 - .delsys = { SYS_DVBC_ANNEX_A, SYS_DVBC_ANNEX_C }, 6339 + static struct dvb_frontend_ops drxk_ops = { 6340 + /* .delsys will be filled dynamically */ 6355 6341 .info = { 6356 - .name = "DRXK DVB-C", 6357 - .frequency_min = 47000000, 6358 - .frequency_max = 862000000, 6359 - .symbol_rate_min = 870000, 6360 - .symbol_rate_max = 11700000, 6361 - .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 | 6362 - FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO}, 6363 - .release = drxk_c_release, 6364 - .init = drxk_c_init, 6365 - .sleep = drxk_c_sleep, 6342 + .name = "DRXK", 6343 + .frequency_min = 47000000, 6344 + .frequency_max = 865000000, 6345 + /* For DVB-C */ 6346 + .symbol_rate_min = 870000, 6347 + .symbol_rate_max = 11700000, 6348 + /* For DVB-T */ 6349 + .frequency_stepsize = 166667, 6350 + 6351 + .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 | 6352 + FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO | 6353 + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 6354 + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_MUTE_TS | 6355 + FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER | 6356 + FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO 6357 + }, 6358 + 6359 + .release = drxk_release, 6360 + .sleep = drxk_sleep, 6366 6361 .i2c_gate_ctrl = drxk_gate_ctrl, 6367 6362 6368 6363 .set_frontend = drxk_set_parameters, 6369 - .get_tune_settings = drxk_c_get_tune_settings, 6370 - 6371 - .read_status = drxk_read_status, 6372 - .read_ber = drxk_read_ber, 6373 - .read_signal_strength = drxk_read_signal_strength, 6374 - .read_snr = drxk_read_snr, 6375 - .read_ucblocks = drxk_read_ucblocks, 6376 - }; 6377 - 6378 - static struct dvb_frontend_ops drxk_t_ops = { 6379 - .delsys = { SYS_DVBT }, 6380 - .info = { 6381 - .name = "DRXK DVB-T", 6382 - .frequency_min = 47125000, 6383 - .frequency_max = 865000000, 6384 - .frequency_stepsize = 166667, 6385 - .frequency_tolerance = 0, 6386 - .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | 6387 - FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | 6388 - FE_CAN_FEC_AUTO | 6389 - FE_CAN_QAM_16 | FE_CAN_QAM_64 | 6390 - FE_CAN_QAM_AUTO | 6391 - FE_CAN_TRANSMISSION_MODE_AUTO | 6392 - FE_CAN_GUARD_INTERVAL_AUTO | 6393 - FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_MUTE_TS}, 6394 - .release = drxk_t_release, 6395 - .init = drxk_t_init, 6396 - .sleep = drxk_t_sleep, 6397 - .i2c_gate_ctrl = drxk_gate_ctrl, 6398 - 6399 - .set_frontend = drxk_set_parameters, 6364 + .get_tune_settings = drxk_get_tune_settings, 6400 6365 6401 6366 .read_status = drxk_read_status, 6402 6367 .read_ber = drxk_read_ber, ··· 6369 6408 }; 6370 6409 6371 6410 struct dvb_frontend *drxk_attach(const struct drxk_config *config, 6372 - struct i2c_adapter *i2c, 6373 - struct dvb_frontend **fe_t) 6411 + struct i2c_adapter *i2c) 6374 6412 { 6413 + int n; 6414 + 6375 6415 struct drxk_state *state = NULL; 6376 6416 u8 adr = config->adr; 6377 6417 ··· 6407 6445 mutex_init(&state->mutex); 6408 6446 mutex_init(&state->ctlock); 6409 6447 6410 - memcpy(&state->c_frontend.ops, &drxk_c_ops, 6411 - sizeof(struct dvb_frontend_ops)); 6412 - memcpy(&state->t_frontend.ops, &drxk_t_ops, 6413 - sizeof(struct dvb_frontend_ops)); 6414 - state->c_frontend.demodulator_priv = state; 6415 - state->t_frontend.demodulator_priv = state; 6448 + memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops)); 6449 + state->frontend.demodulator_priv = state; 6416 6450 6417 6451 init_state(state); 6418 6452 if (init_drxk(state) < 0) 6419 6453 goto error; 6420 - *fe_t = &state->t_frontend; 6454 + 6455 + /* Initialize the supported delivery systems */ 6456 + n = 0; 6457 + if (state->m_hasDVBC) { 6458 + state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_A; 6459 + state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_C; 6460 + strlcat(state->frontend.ops.info.name, " DVB-C", 6461 + sizeof(state->frontend.ops.info.name)); 6462 + } 6463 + if (state->m_hasDVBT) { 6464 + state->frontend.ops.delsys[n++] = SYS_DVBT; 6465 + strlcat(state->frontend.ops.info.name, " DVB-T", 6466 + sizeof(state->frontend.ops.info.name)); 6467 + } 6421 6468 6422 6469 printk(KERN_INFO "drxk: frontend initialized.\n"); 6423 - 6424 - return &state->c_frontend; 6470 + return &state->frontend; 6425 6471 6426 6472 error: 6427 6473 printk(KERN_ERR "drxk: not found\n");
+1 -2
drivers/media/dvb/frontends/drxk_hard.h
··· 195 195 }; 196 196 197 197 struct drxk_state { 198 - struct dvb_frontend c_frontend; 199 - struct dvb_frontend t_frontend; 198 + struct dvb_frontend frontend; 200 199 struct dtv_frontend_properties props; 201 200 struct device *dev; 202 201
+1 -1
drivers/media/dvb/ngene/ngene-cards.c
··· 218 218 memset(&config, 0, sizeof(config)); 219 219 config.adr = 0x29 + (chan->number ^ 2); 220 220 221 - chan->fe = dvb_attach(drxk_attach, &config, i2c, &chan->fe2); 221 + chan->fe = dvb_attach(drxk_attach, &config, i2c); 222 222 if (!chan->fe) { 223 223 printk(KERN_ERR "No DRXK found!\n"); 224 224 return -ENODEV;
+2 -26
drivers/media/video/em28xx/em28xx-dvb.c
··· 874 874 struct xc5000_config cfg; 875 875 hauppauge_hvr930c_init(dev); 876 876 877 - dvb->dont_attach_fe1 = 1; 878 - 879 877 dvb->fe[0] = dvb_attach(drxk_attach, 880 - &hauppauge_930c_drxk, &dev->i2c_adap, 881 - &dvb->fe[1]); 878 + &hauppauge_930c_drxk, &dev->i2c_adap); 882 879 if (!dvb->fe[0]) { 883 880 result = -EINVAL; 884 881 goto out_free; ··· 885 888 sema_init(&dvb->pll_mutex, 1); 886 889 dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl; 887 890 dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl; 888 - dvb->fe[1]->id = 1; 889 891 890 892 /* Attach xc5000 */ 891 893 memset(&cfg, 0, sizeof(cfg)); ··· 898 902 result = -EINVAL; 899 903 goto out_free; 900 904 } 901 - 902 905 if (dvb->fe[0]->ops.i2c_gate_ctrl) 903 906 dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0); 904 - 905 - /* Hack - needed by drxk/tda18271c2dd */ 906 - dvb->fe[1]->tuner_priv = dvb->fe[0]->tuner_priv; 907 - memcpy(&dvb->fe[1]->ops.tuner_ops, 908 - &dvb->fe[0]->ops.tuner_ops, 909 - sizeof(dvb->fe[0]->ops.tuner_ops)); 910 - 911 - mfe_shared = 1; 912 907 913 908 break; 914 909 } ··· 907 920 case EM2884_BOARD_CINERGY_HTC_STICK: 908 921 terratec_h5_init(dev); 909 922 910 - dvb->dont_attach_fe1 = 1; 911 - 912 - dvb->fe[0] = dvb_attach(drxk_attach, &terratec_h5_drxk, &dev->i2c_adap, &dvb->fe[1]); 923 + dvb->fe[0] = dvb_attach(drxk_attach, &terratec_h5_drxk, &dev->i2c_adap); 913 924 if (!dvb->fe[0]) { 914 925 result = -EINVAL; 915 926 goto out_free; ··· 917 932 sema_init(&dvb->pll_mutex, 1); 918 933 dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl; 919 934 dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl; 920 - dvb->fe[1]->id = 1; 921 935 922 936 /* Attach tda18271 to DVB-C frontend */ 923 937 if (dvb->fe[0]->ops.i2c_gate_ctrl) ··· 927 943 } 928 944 if (dvb->fe[0]->ops.i2c_gate_ctrl) 929 945 dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0); 930 - 931 - /* Hack - needed by drxk/tda18271c2dd */ 932 - dvb->fe[1]->tuner_priv = dvb->fe[0]->tuner_priv; 933 - memcpy(&dvb->fe[1]->ops.tuner_ops, 934 - &dvb->fe[0]->ops.tuner_ops, 935 - sizeof(dvb->fe[0]->ops.tuner_ops)); 936 - 937 - mfe_shared = 1; 938 946 939 947 break; 940 948 case EM28174_BOARD_PCTV_460E: