|
@@ -696,17 +696,32 @@ static int tuner_probe(struct i2c_client *client,
|
|
|
/* Should be just before return */
|
|
|
register_client:
|
|
|
#if defined(CONFIG_MEDIA_CONTROLLER)
|
|
|
- t->pad[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK;
|
|
|
- t->pad[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE;
|
|
|
- t->pad[TUNER_PAD_AUD_OUT].flags = MEDIA_PAD_FL_SOURCE;
|
|
|
- t->sd.entity.function = MEDIA_ENT_F_TUNER;
|
|
|
t->sd.entity.name = t->name;
|
|
|
+ /*
|
|
|
+ * Handle the special case where the tuner has actually
|
|
|
+ * two stages: the PLL to tune into a frequency and the
|
|
|
+ * IF-PLL demodulator (tda988x).
|
|
|
+ */
|
|
|
+ if (t->type == TUNER_TDA9887) {
|
|
|
+ t->pad[IF_VID_DEC_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK;
|
|
|
+ t->pad[IF_VID_DEC_PAD_OUT].flags = MEDIA_PAD_FL_SOURCE;
|
|
|
+ ret = media_entity_pads_init(&t->sd.entity,
|
|
|
+ IF_VID_DEC_PAD_NUM_PADS,
|
|
|
+ &t->pad[0]);
|
|
|
+ t->sd.entity.function = MEDIA_ENT_F_IF_VID_DECODER;
|
|
|
+ } else {
|
|
|
+ t->pad[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK;
|
|
|
+ t->pad[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE;
|
|
|
+ t->pad[TUNER_PAD_AUD_OUT].flags = MEDIA_PAD_FL_SOURCE;
|
|
|
+ ret = media_entity_pads_init(&t->sd.entity, TUNER_NUM_PADS,
|
|
|
+ &t->pad[0]);
|
|
|
+ t->sd.entity.function = MEDIA_ENT_F_TUNER;
|
|
|
+ }
|
|
|
|
|
|
- ret = media_entity_pads_init(&t->sd.entity, TUNER_NUM_PADS, &t->pad[0]);
|
|
|
if (ret < 0) {
|
|
|
tuner_err("failed to initialize media entity!\n");
|
|
|
kfree(t);
|
|
|
- return -ENODEV;
|
|
|
+ return ret;
|
|
|
}
|
|
|
#endif
|
|
|
/* Sets a default mode */
|