diff mbox

[media] dvb-core, tda18271c2dd: define get_if_frequency() callback

Message ID 1315062777-12049-1-git-send-email-mchehab@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Mauro Carvalho Chehab Sept. 3, 2011, 3:12 p.m. UTC
The DRX-K frontend needs to know the IF frequency in order to work,
just like all other frontends. However, as it is a multi-standard
FE, the IF may change if the standard is changed. So, the usual
procedure of passing it via a config struct doesn't work.

One might code it as two separate IF frequencies, one by each type
of FE, but, as, on tda18271, the IF changes if the bandwidth for
DVB-C changes, this also won't work.

So, the better is to just add a new callback for it and require
it for the tuners that can be used with MFE frontends like drx-k.

It makes sense to add support for it on all existing tuners, and
remove the IF parameter from the demods, cleaning up the code.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
 drivers/media/dvb/dvb-core/dvb_frontend.h  |    1 +
 drivers/media/dvb/frontends/drxk_hard.c    |   10 +++++++++-
 drivers/media/dvb/frontends/tda18271c2dd.c |    4 ++--
 3 files changed, 12 insertions(+), 3 deletions(-)

Comments

Antti Palosaari Sept. 3, 2011, 3:24 p.m. UTC | #1
On 09/03/2011 06:12 PM, Mauro Carvalho Chehab wrote:
> The DRX-K frontend needs to know the IF frequency in order to work,
> just like all other frontends. However, as it is a multi-standard
> FE, the IF may change if the standard is changed. So, the usual
> procedure of passing it via a config struct doesn't work.
>
> One might code it as two separate IF frequencies, one by each type
> of FE, but, as, on tda18271, the IF changes if the bandwidth for
> DVB-C changes, this also won't work.
>
> So, the better is to just add a new callback for it and require
> it for the tuners that can be used with MFE frontends like drx-k.
>
> It makes sense to add support for it on all existing tuners, and
> remove the IF parameter from the demods, cleaning up the code.

Is it clear that only used tuner IC defines used IF?

I have seen some cases where used IF is different depending on other 
used hardware, even same tuner IC used. Very good example is to see all 
configuration structs of old tda18271 driver. Those are mainly used for 
setting different IF than tuner default...

Antti
Antti Palosaari Sept. 3, 2011, 3:38 p.m. UTC | #2
On 09/03/2011 06:24 PM, Antti Palosaari wrote:
> On 09/03/2011 06:12 PM, Mauro Carvalho Chehab wrote:
>> The DRX-K frontend needs to know the IF frequency in order to work,
>> just like all other frontends. However, as it is a multi-standard
>> FE, the IF may change if the standard is changed. So, the usual
>> procedure of passing it via a config struct doesn't work.
>>
>> One might code it as two separate IF frequencies, one by each type
>> of FE, but, as, on tda18271, the IF changes if the bandwidth for
>> DVB-C changes, this also won't work.
>>
>> So, the better is to just add a new callback for it and require
>> it for the tuners that can be used with MFE frontends like drx-k.
>>
>> It makes sense to add support for it on all existing tuners, and
>> remove the IF parameter from the demods, cleaning up the code.
>
> Is it clear that only used tuner IC defines used IF?
>
> I have seen some cases where used IF is different depending on other
> used hardware, even same tuner IC used. Very good example is to see all
> configuration structs of old tda18271 driver. Those are mainly used for
> setting different IF than tuner default...

Hmm, I think that will actually only reduce defining same IFs to demod 
which are already set to tuner allowing to remove "redundant" demod 
definitions. OK, now it looks fine for me.

Acked-by: Antti Palosaari <crope@iki.fi>


Antti
Mauro Carvalho Chehab Sept. 3, 2011, 3:42 p.m. UTC | #3
Em 03-09-2011 12:38, Antti Palosaari escreveu:
> On 09/03/2011 06:24 PM, Antti Palosaari wrote:
>> On 09/03/2011 06:12 PM, Mauro Carvalho Chehab wrote:
>>> The DRX-K frontend needs to know the IF frequency in order to work,
>>> just like all other frontends. However, as it is a multi-standard
>>> FE, the IF may change if the standard is changed. So, the usual
>>> procedure of passing it via a config struct doesn't work.
>>>
>>> One might code it as two separate IF frequencies, one by each type
>>> of FE, but, as, on tda18271, the IF changes if the bandwidth for
>>> DVB-C changes, this also won't work.
>>>
>>> So, the better is to just add a new callback for it and require
>>> it for the tuners that can be used with MFE frontends like drx-k.
>>>
>>> It makes sense to add support for it on all existing tuners, and
>>> remove the IF parameter from the demods, cleaning up the code.
>>
>> Is it clear that only used tuner IC defines used IF?
>>
>> I have seen some cases where used IF is different depending on other
>> used hardware, even same tuner IC used. Very good example is to see all
>> configuration structs of old tda18271 driver. Those are mainly used for
>> setting different IF than tuner default...

Not sure if I understood your comments here.

There are two separate things here:

1) digital tuners like tda18271, xc3028, etc allow changing the IF frequency,
while others, like the analog tuners, have a fixed IF frequency. For digital
tuners, it makes sense to have ways to configure it, via the tuner's configuration
file, like the tda18271-fe driver.

This patch doesn't change anything with that regards.

2) Demods need to know what IF is used by the tuner. Currently, the bridge driver
needs to fill a per-demod configuration struct for it, or pass it via parameter.

This works fine, when the IF is fixed.

However, the tda18271 specs recommend different IF values for each bandwidth, and
between dvb-t and dvb-c.

It would be possible to workaround that and just use the same IF for everything
at tda18271, not obeying the recommended values, but this seems a bad idea, as
the chipset will be used on a non-tested configuration.

So, instead of fixing the same IF at the tuner, this patch allows the tuner to
change the IF as needed/desired, and letting the demod to change according with
the tuner changes.

I'll put the above comments at the committed patch.

> Hmm, I think that will actually only reduce defining same IFs to demod which are already set to tuner allowing to remove "redundant" demod definitions. OK, now it looks fine for me.
> 
> Acked-by: Antti Palosaari <crope@iki.fi>

Thanks!


> 
> 
> Antti

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h
index 5590eb6..67bbfa7 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.h
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.h
@@ -209,6 +209,7 @@  struct dvb_tuner_ops {
 
 	int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency);
 	int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);
+	int (*get_if_frequency)(struct dvb_frontend *fe, u32 *frequency);
 
 #define TUNER_STATUS_LOCKED 1
 #define TUNER_STATUS_STEREO 2
diff --git a/drivers/media/dvb/frontends/drxk_hard.c b/drivers/media/dvb/frontends/drxk_hard.c
index 41b0838..f6431ef 100644
--- a/drivers/media/dvb/frontends/drxk_hard.c
+++ b/drivers/media/dvb/frontends/drxk_hard.c
@@ -6211,6 +6211,14 @@  static int drxk_set_parameters(struct dvb_frontend *fe,
 	u32 IF;
 
 	dprintk(1, "\n");
+
+	if (!fe->ops.tuner_ops.get_if_frequency) {
+		printk(KERN_ERR
+		       "drxk: Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
+		return -EINVAL;
+	}
+
+
 	if (fe->ops.i2c_gate_ctrl)
 		fe->ops.i2c_gate_ctrl(fe, 1);
 	if (fe->ops.tuner_ops.set_params)
@@ -6218,7 +6226,7 @@  static int drxk_set_parameters(struct dvb_frontend *fe,
 	if (fe->ops.i2c_gate_ctrl)
 		fe->ops.i2c_gate_ctrl(fe, 0);
 	state->param = *p;
-	fe->ops.tuner_ops.get_frequency(fe, &IF);
+	fe->ops.tuner_ops.get_if_frequency(fe, &IF);
 	Start(state, 0, IF);
 
 	/* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
diff --git a/drivers/media/dvb/frontends/tda18271c2dd.c b/drivers/media/dvb/frontends/tda18271c2dd.c
index 0384e8d..1b1bf20 100644
--- a/drivers/media/dvb/frontends/tda18271c2dd.c
+++ b/drivers/media/dvb/frontends/tda18271c2dd.c
@@ -1195,7 +1195,7 @@  static int GetSignalStrength(s32 *pSignalStrength, u32 RFAgc, u32 IFAgc)
 }
 #endif
 
-static int get_frequency(struct dvb_frontend *fe, u32 *frequency)
+static int get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
 {
 	struct tda_state *state = fe->tuner_priv;
 
@@ -1222,7 +1222,7 @@  static struct dvb_tuner_ops tuner_ops = {
 	.sleep             = sleep,
 	.set_params        = set_params,
 	.release           = release,
-	.get_frequency     = get_frequency,
+	.get_if_frequency  = get_if_frequency,
 	.get_bandwidth     = get_bandwidth,
 };