This is used in conjunction with the STV0367 demodulator on
the STV0367-NIM-V1.0 NIM card which can be used with the STi
STB SoC's.

This tuner has a fifth register, so some changes have been made
to accommodate this.

Signed-off-by: Peter Griffin <peter.grif...@linaro.org>
---
 drivers/media/dvb-frontends/dvb-pll.c | 74 +++++++++++++++++++++++++++++------
 drivers/media/dvb-frontends/dvb-pll.h |  1 +
 2 files changed, 64 insertions(+), 11 deletions(-)

diff --git a/drivers/media/dvb-frontends/dvb-pll.c 
b/drivers/media/dvb-frontends/dvb-pll.c
index 6d8fe88..f7381c7 100644
--- a/drivers/media/dvb-frontends/dvb-pll.c
+++ b/drivers/media/dvb-frontends/dvb-pll.c
@@ -141,6 +141,35 @@ static struct dvb_pll_desc dvb_pll_thomson_dtt7520x = {
        },
 };
 
+static void thomson_dtt7546x_bw(struct dvb_frontend *fe, u8 *buf)
+{
+       /* set CB2 reg - set ATC, XTO */
+       buf[4] = 0xc3;
+}
+
+static struct dvb_pll_desc dvb_pll_thomson_dtt7546x = {
+       .name  = "Thomson dtt7546x",
+       .min   = 44250000,
+       .max   = 863250000,
+       .set   = thomson_dtt7546x_bw,
+       .iffreq= 36166667,
+       .count = 12,
+       .entries = {
+               {  121000000, 166667, 0x88, 0x01 },
+               {  141000000, 166667, 0x88, 0x41 },
+               {  166000000, 166667, 0x88, 0x81 },
+               {  182000000, 166667, 0x88, 0xc1 },
+               {  286000000, 166667, 0x88, 0x02 },
+               {  386000000, 166667, 0x88, 0x42 },
+               {  446000000, 166667, 0x88, 0x82 },
+               {  466000000, 166667, 0x88, 0xc2 },
+               {  506000000, 166667, 0x88, 0x08 },
+               {  761000000, 166667, 0x88, 0x48 },
+               {  846000000, 166667, 0x88, 0x88 },
+               {  905000000, 166667, 0x88, 0xc8 },
+       },
+};
+
 static struct dvb_pll_desc dvb_pll_lg_z201 = {
        .name  = "LG z201",
        .min   = 174000000,
@@ -537,6 +566,7 @@ static struct dvb_pll_desc dvb_pll_alps_tdee4 = {
 static struct dvb_pll_desc *pll_list[] = {
        [DVB_PLL_UNDEFINED]              = NULL,
        [DVB_PLL_THOMSON_DTT7579]        = &dvb_pll_thomson_dtt7579,
+       [DVB_PLL_THOMSON_DTT7546X]       = &dvb_pll_thomson_dtt7546x,
        [DVB_PLL_THOMSON_DTT759X]        = &dvb_pll_thomson_dtt759x,
        [DVB_PLL_THOMSON_DTT7520X]       = &dvb_pll_thomson_dtt7520x,
        [DVB_PLL_LG_Z201]                = &dvb_pll_lg_z201,
@@ -561,7 +591,7 @@ static struct dvb_pll_desc *pll_list[] = {
 /* code                                                        */
 
 static int dvb_pll_configure(struct dvb_frontend *fe, u8 *buf,
-                            const u32 frequency)
+                       const u32 frequency, const u32 len)
 {
        struct dvb_pll_priv *priv = fe->tuner_priv;
        struct dvb_pll_desc *desc = priv->pll_desc;
@@ -593,11 +623,15 @@ static int dvb_pll_configure(struct dvb_frontend *fe, u8 
*buf,
        if (desc->set)
                desc->set(fe, buf);
 
-       if (debug)
-               printk("pll: %s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n",
-                      desc->name, div, buf[0], buf[1], buf[2], buf[3]);
+       if (debug) {
+               printk(KERN_DEBUG "pll: %s: div=%d | buf=", desc->name, div);
+               for (i = 0; i < len; i++)
+                       printk(KERN_DEBUG "0x%02x,", buf[i]);
 
-       // calculate the frequency we set it to
+               printk(KERN_DEBUG "\n");
+       }
+
+       /* calculate the frequency we set it to */
        return (div * desc->entries[i].stepsize) - desc->iffreq;
 }
 
@@ -634,21 +668,39 @@ static int dvb_pll_sleep(struct dvb_frontend *fe)
        return -EINVAL;
 }
 
+static int dvb_pll_get_num_regs(struct dvb_pll_priv *priv)
+{
+       int num_regs = 4;
+
+       if (strncmp(priv->pll_desc->name, "Thomson dtt7546x", 16) == 0)
+               num_regs = 5;
+
+       return num_regs;
+}
+
 static int dvb_pll_set_params(struct dvb_frontend *fe)
 {
        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
        struct dvb_pll_priv *priv = fe->tuner_priv;
-       u8 buf[4];
-       struct i2c_msg msg =
-               { .addr = priv->pll_i2c_address, .flags = 0,
-                 .buf = buf, .len = sizeof(buf) };
+       struct i2c_msg msg;
+       u8 *bufp;
        int result;
        u32 frequency = 0;
 
+       bufp = kzalloc(dvb_pll_get_num_regs(priv), GFP_KERNEL);
+
+       if (!bufp)
+               return -ENOMEM;
+
+       msg.addr = priv->pll_i2c_address;
+       msg.flags = 0;
+       msg.buf = bufp;
+       msg.len = dvb_pll_get_num_regs(priv);
+
        if (priv->i2c == NULL)
                return -EINVAL;
 
-       result = dvb_pll_configure(fe, buf, c->frequency);
+       result = dvb_pll_configure(fe, bufp, c->frequency, msg.len);
        if (result < 0)
                return result;
        else
@@ -677,7 +729,7 @@ static int dvb_pll_calc_regs(struct dvb_frontend *fe,
        if (buf_len < 5)
                return -EINVAL;
 
-       result = dvb_pll_configure(fe, buf + 1, c->frequency);
+       result = dvb_pll_configure(fe, buf + 1, c->frequency, buf_len - 1);
        if (result < 0)
                return result;
        else
diff --git a/drivers/media/dvb-frontends/dvb-pll.h 
b/drivers/media/dvb-frontends/dvb-pll.h
index bf9602a..f523f42 100644
--- a/drivers/media/dvb-frontends/dvb-pll.h
+++ b/drivers/media/dvb-frontends/dvb-pll.h
@@ -28,6 +28,7 @@
 #define DVB_PLL_SAMSUNG_TBMU24112      17
 #define DVB_PLL_TDEE4                 18
 #define DVB_PLL_THOMSON_DTT7520X       19
+#define DVB_PLL_THOMSON_DTT7546X       20
 
 /**
  * Attach a dvb-pll to the supplied frontend structure.
-- 
1.9.1

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

Reply via email to