From 8edeb6eb1ae113b8f25a79e5076c1a1ec93538d0 Mon Sep 17 00:00:00 2001 From: "istvan_v@mailbox.hu" Date: Mon, 6 Jun 2011 13:03:44 -0300 Subject: [PATCH] [media] xc4000: removed card_type Removed the use of 'card_type' from the tuner configuration structure, and replaced it with separate parameters to set board-specific configuration. Signed-off-by: Istvan Varga Cc: Patrick Boettcher Signed-off-by: Mauro Carvalho Chehab --- drivers/media/common/tuners/xc4000.c | 75 ++++++++++++++--------------- drivers/media/common/tuners/xc4000.h | 14 +++--- drivers/media/dvb/dvb-usb/dib0700_devices.c | 8 +-- drivers/media/video/tuner-core.c | 8 ++- 4 files changed, 55 insertions(+), 50 deletions(-) diff --git a/drivers/media/common/tuners/xc4000.c b/drivers/media/common/tuners/xc4000.c index a053dece60ce..479c198e9469 100644 --- a/drivers/media/common/tuners/xc4000.c +++ b/drivers/media/common/tuners/xc4000.c @@ -92,14 +92,16 @@ struct xc4000_priv { struct list_head hybrid_tuner_instance_list; struct firmware_description *firm; int firm_size; - __u16 firm_version; u32 if_khz; u32 freq_hz; u32 bandwidth; u8 video_standard; u8 rf_mode; - u8 card_type; + u8 default_pm; + u8 dvb_amplitude; + u8 set_smoothedcvbs; u8 ignore_i2c_write_errors; + __u16 firm_version; struct firmware_properties cur_fw; __u16 hwmodel; __u16 hwvers; @@ -1226,19 +1228,22 @@ static int xc4000_set_params(struct dvb_frontend *fe, } } - if (priv->card_type == XC4000_CARD_WINFAST_CX88) { - if (xc_write_reg(priv, XREG_D_CODE, 0) == 0) - ret = 0; + if (xc_write_reg(priv, XREG_D_CODE, 0) == 0) + ret = 0; + if (priv->dvb_amplitude != 0) { if (xc_write_reg(priv, XREG_AMPLITUDE, - (priv->firm_version == 0x0102 ? 132 : 134)) - != 0) + (priv->firm_version != 0x0102 || + priv->dvb_amplitude != 134 ? + priv->dvb_amplitude : 132)) != 0) ret = -EREMOTEIO; + } + if (priv->set_smoothedcvbs != 0) { if (xc_write_reg(priv, XREG_SMOOTHEDCVBS, 1) != 0) ret = -EREMOTEIO; - if (ret != 0) { - printk(KERN_ERR "xc4000: setting registers failed\n"); - /* goto fail; */ - } + } + if (ret != 0) { + printk(KERN_ERR "xc4000: setting registers failed\n"); + /* goto fail; */ } xc_tune_channel(priv, priv->freq_hz); @@ -1412,8 +1417,7 @@ tune_channel: if (type & NOGD) video_mode &= 0xFF7F; } else if (priv->video_standard < XC4000_I_PAL_NICAM) { - if (priv->card_type == XC4000_CARD_WINFAST_CX88 && - priv->firm_version == 0x0102) + if (priv->firm_version == 0x0102) video_mode &= 0xFEFF; if (audio_std & XC4000_AUDIO_STD_B) video_mode |= 0x0080; @@ -1425,17 +1429,17 @@ tune_channel: } } - if (priv->card_type == XC4000_CARD_WINFAST_CX88) { - if (xc_write_reg(priv, XREG_D_CODE, 0) == 0) - ret = 0; - if (xc_write_reg(priv, XREG_AMPLITUDE, 1) != 0) - ret = -EREMOTEIO; + if (xc_write_reg(priv, XREG_D_CODE, 0) == 0) + ret = 0; + if (xc_write_reg(priv, XREG_AMPLITUDE, 1) != 0) + ret = -EREMOTEIO; + if (priv->set_smoothedcvbs != 0) { if (xc_write_reg(priv, XREG_SMOOTHEDCVBS, 1) != 0) ret = -EREMOTEIO; - if (ret != 0) { - printk(KERN_ERR "xc4000: setting registers failed\n"); - goto fail; - } + } + if (ret != 0) { + printk(KERN_ERR "xc4000: setting registers failed\n"); + goto fail; } xc_tune_channel(priv, priv->freq_hz); @@ -1516,8 +1520,7 @@ static int xc4000_sleep(struct dvb_frontend *fe) /* Avoid firmware reload on slow devices */ if ((no_poweroff == 2 || - (no_poweroff == 0 && - priv->card_type != XC4000_CARD_WINFAST_CX88)) && + (no_poweroff == 0 && priv->default_pm != 0)) && (priv->cur_fw.type & BASE) != 0) { /* force reset and firmware reload */ priv->cur_fw.type = XC_POWERED_DOWN; @@ -1588,16 +1591,6 @@ struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe, int instance; u16 id = 0; - if (cfg->card_type != XC4000_CARD_GENERIC) { - if (cfg->card_type == XC4000_CARD_WINFAST_CX88) { - cfg->i2c_address = 0x61; - cfg->if_khz = 4560; - } else { /* default to PCTV 340E */ - cfg->i2c_address = 0x61; - cfg->if_khz = 5400; - } - } - dprintk(1, "%s(%d-%04x)\n", __func__, i2c ? i2c_adapter_id(i2c) : -1, cfg ? cfg->i2c_address : -1); @@ -1607,8 +1600,6 @@ struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe, instance = hybrid_tuner_request_state(struct xc4000_priv, priv, hybrid_tuner_instance_list, i2c, cfg->i2c_address, "xc4000"); - if (cfg->card_type != XC4000_CARD_GENERIC) - priv->card_type = cfg->card_type; switch (instance) { case 0: goto fail; @@ -1616,6 +1607,11 @@ struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe, case 1: /* new tuner instance */ priv->bandwidth = BANDWIDTH_6_MHZ; + /* set default configuration */ + priv->if_khz = 4560; + priv->default_pm = 0; + priv->dvb_amplitude = 134; + priv->set_smoothedcvbs = 1; mutex_init(&priv->lock); fe->tuner_priv = priv; break; @@ -1626,10 +1622,11 @@ struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe, } if (cfg->if_khz != 0) { - /* If the IF hasn't been set yet, use the value provided by - the caller (occurs in hybrid devices where the analog - call to xc4000_attach occurs before the digital side) */ + /* copy configuration if provided by the caller */ priv->if_khz = cfg->if_khz; + priv->default_pm = cfg->default_pm; + priv->dvb_amplitude = cfg->dvb_amplitude; + priv->set_smoothedcvbs = cfg->set_smoothedcvbs; } /* Check if firmware has been loaded. It is possible that another diff --git a/drivers/media/common/tuners/xc4000.h b/drivers/media/common/tuners/xc4000.h index d560d01cc82b..442cb0fc9338 100644 --- a/drivers/media/common/tuners/xc4000.h +++ b/drivers/media/common/tuners/xc4000.h @@ -27,13 +27,15 @@ struct dvb_frontend; struct i2c_adapter; -#define XC4000_CARD_GENERIC 0 -#define XC4000_CARD_PCTV_340E 1 -#define XC4000_CARD_WINFAST_CX88 2 - struct xc4000_config { - u8 card_type; /* if card type is not generic, all other */ - u8 i2c_address; /* parameters are automatically set */ + u8 i2c_address; + /* if non-zero, power management is enabled by default */ + u8 default_pm; + /* value to be written to XREG_AMPLITUDE in DVB-T mode (0: no write) */ + u8 dvb_amplitude; + /* if non-zero, register 0x0E is set to filter analog TV video output */ + u8 set_smoothedcvbs; + /* IF for DVB-T */ u32 if_khz; }; diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c index d546270d3f5d..ae0abc5dcf94 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c @@ -2778,10 +2778,12 @@ static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap) return adap->fe == NULL ? -ENODEV : 0; } - static struct xc4000_config dib7000p_xc4000_tunerconfig = { - .i2c_address = 0x61, - .if_khz = 5400, + .i2c_address = 0x61, + .default_pm = 1, + .dvb_amplitude = 0, + .set_smoothedcvbs = 0, + .if_khz = 5400 }; static int xc4000_tuner_attach(struct dvb_usb_adapter *adap) diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index 850b45d042ff..11cc980b0cd5 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c @@ -396,8 +396,12 @@ static void set_type(struct i2c_client *c, unsigned int type, { struct xc4000_config xc4000_cfg = { .i2c_address = t->i2c->addr, - /* if_khz will be set when the digital dvb_attach() occurs */ - .if_khz = 0, + /* FIXME: the correct parameters will be set */ + /* only when the digital dvb_attach() occurs */ + .default_pm = 0, + .dvb_amplitude = 0, + .set_smoothedcvbs = 0, + .if_khz = 0 }; if (!dvb_attach(xc4000_attach, &t->fe, t->i2c->adapter, &xc4000_cfg)) -- 2.11.0