V4L/DVB (10800): Add support for ST LNBH24 LNB power controller.
authorIgor M. Liplianin <liplianin@netup.ru>
Tue, 3 Mar 2009 14:24:18 +0000 (11:24 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:43:04 +0000 (12:43 -0300)
The controller consist of two independent parts.
Every part is similar to LNBP21, but has configurable i2c address.
It is used in NetUP Dual DVB-S2 CI card.
http://linuxtv.org/wiki/index.php/NetUP_Dual_DVB_S2_CI

Signed-off-by: Igor M. Liplianin <liplianin@netup.ru>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/frontends/Kconfig
drivers/media/dvb/frontends/lnbh24.h [new file with mode: 0644]
drivers/media/dvb/frontends/lnbp21.c
drivers/media/dvb/frontends/lnbp21.h

index 649ac75..d3cfced 100644 (file)
@@ -453,11 +453,11 @@ comment "SEC control devices for DVB-S"
        depends on DVB_CORE
 
 config DVB_LNBP21
-       tristate "LNBP21 SEC controller"
+       tristate "LNBP21/LNBH24 SEC controllers"
        depends on DVB_CORE && I2C
        default m if DVB_FE_CUSTOMISE
        help
-         An SEC control chip.
+         An SEC control chips.
 
 config DVB_ISL6405
        tristate "ISL6405 SEC controller"
diff --git a/drivers/media/dvb/frontends/lnbh24.h b/drivers/media/dvb/frontends/lnbh24.h
new file mode 100644 (file)
index 0000000..c059b16
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * lnbh24.h - driver for lnb supply and control ic lnbh24
+ *
+ * Copyright (C) 2009 NetUP Inc.
+ * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef _LNBH24_H
+#define _LNBH24_H
+
+/* system register bits */
+#define LNBH24_OLF     0x01
+#define LNBH24_OTF     0x02
+#define LNBH24_EN      0x04
+#define LNBH24_VSEL    0x08
+#define LNBH24_LLC     0x10
+#define LNBH24_TEN     0x20
+#define LNBH24_TTX     0x40
+#define LNBH24_PCL     0x80
+
+#include <linux/dvb/frontend.h>
+
+#if defined(CONFIG_DVB_LNBP21) || (defined(CONFIG_DVB_LNBP21_MODULE) \
+                                                       && defined(MODULE))
+/* override_set and override_clear control which
+   system register bits (above) to always set & clear */
+extern struct dvb_frontend *lnbh24_attach(struct dvb_frontend *fe,
+                               struct i2c_adapter *i2c, u8 override_set,
+                               u8 override_clear, u8 i2c_addr);
+#else
+static inline struct dvb_frontend *lnbh24_attach(struct dvb_frontend *fe,
+                               struct i2c_adapter *i2c, u8 override_set,
+                               u8 override_clear, u8 i2c_addr)
+{
+       printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
+       return NULL;
+}
+#endif
+
+#endif
index 76f935d..772a0bb 100644 (file)
@@ -1,7 +1,8 @@
 /*
- * lnbp21.h - driver for lnb supply and control ic lnbp21
+ * lnbp21.c - driver for lnb supply and control ic lnbp21
  *
  * Copyright (C) 2006 Oliver Endriss
+ * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 
 #include "dvb_frontend.h"
 #include "lnbp21.h"
+#include "lnbh24.h"
 
 struct lnbp21 {
        u8                      config;
        u8                      override_or;
        u8                      override_and;
        struct i2c_adapter      *i2c;
+       u8                      i2c_addr;
 };
 
-static int lnbp21_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
+static int lnbp21_set_voltage(struct dvb_frontend *fe,
+                                       fe_sec_voltage_t voltage)
 {
        struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->sec_priv;
-       struct i2c_msg msg = {  .addr = 0x08, .flags = 0,
+       struct i2c_msg msg = {  .addr = lnbp21->i2c_addr, .flags = 0,
                                .buf = &lnbp21->config,
                                .len = sizeof(lnbp21->config) };
 
@@ -72,7 +76,7 @@ static int lnbp21_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
 static int lnbp21_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg)
 {
        struct lnbp21 *lnbp21 = (struct lnbp21 *) fe->sec_priv;
-       struct i2c_msg msg = {  .addr = 0x08, .flags = 0,
+       struct i2c_msg msg = {  .addr = lnbp21->i2c_addr, .flags = 0,
                                .buf = &lnbp21->config,
                                .len = sizeof(lnbp21->config) };
 
@@ -97,15 +101,18 @@ static void lnbp21_release(struct dvb_frontend *fe)
        fe->sec_priv = NULL;
 }
 
-struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 override_set, u8 override_clear)
+static struct dvb_frontend *lnbx2x_attach(struct dvb_frontend *fe,
+                               struct i2c_adapter *i2c, u8 override_set,
+                               u8 override_clear, u8 i2c_addr, u8 config)
 {
        struct lnbp21 *lnbp21 = kmalloc(sizeof(struct lnbp21), GFP_KERNEL);
        if (!lnbp21)
                return NULL;
 
        /* default configuration */
-       lnbp21->config = LNBP21_ISEL;
+       lnbp21->config = config;
        lnbp21->i2c = i2c;
+       lnbp21->i2c_addr = i2c_addr;
        fe->sec_priv = lnbp21;
 
        /* bits which should be forced to '1' */
@@ -126,11 +133,29 @@ struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe, struct i2c_adapter *
        /* override frontend ops */
        fe->ops.set_voltage = lnbp21_set_voltage;
        fe->ops.enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage;
+       printk(KERN_INFO "LNBx2x attached on addr=%x", lnbp21->i2c_addr);
 
        return fe;
 }
+
+struct dvb_frontend *lnbp24_attach(struct dvb_frontend *fe,
+                               struct i2c_adapter *i2c, u8 override_set,
+                               u8 override_clear, u8 i2c_addr)
+{
+       return lnbx2x_attach(fe, i2c, override_set, override_clear,
+                                                       i2c_addr, LNBH24_TTX);
+}
+EXPORT_SYMBOL(lnbh24_attach);
+
+struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe,
+                               struct i2c_adapter *i2c, u8 override_set,
+                               u8 override_clear)
+{
+       return lnbx2x_attach(fe, i2c, override_set, override_clear,
+                                                       0x08, LNBP21_ISEL);
+}
 EXPORT_SYMBOL(lnbp21_attach);
 
-MODULE_DESCRIPTION("Driver for lnb supply and control ic lnbp21");
-MODULE_AUTHOR("Oliver Endriss");
+MODULE_DESCRIPTION("Driver for lnb supply and control ic lnbp21, lnbh24");
+MODULE_AUTHOR("Oliver Endriss, Igor M. Liplianin");
 MODULE_LICENSE("GPL");
index b874588..fcdf1c6 100644 (file)
 #define _LNBP21_H
 
 /* system register bits */
-#define LNBP21_OLF     0x01 /* [R-only] 0=OK; 1=over current limit flag*/
-#define LNBP21_OTF     0x02 /* [R-only] 0=OK; 1=over temperature flag (150degC typ) */
-#define LNBP21_EN      0x04 /* [RW] 0=disable LNB power, enable loopthrough; 1=enable LNB power, disable loopthrough*/
-#define LNBP21_VSEL    0x08 /* [RW] 0=low voltage (13/14V, vert pol); 1=high voltage (18/19V,horiz pol) */
-#define LNBP21_LLC     0x10 /* [RW] increase LNB voltage by 1V:  0=13/18V; 1=14/19V */
-#define LNBP21_TEN     0x20 /* [RW] 0=tone controlled by DSQIN pin; 1=tone enable, disable DSQIN */
-#define LNBP21_ISEL    0x40 /* [RW] current limit select 0:Iout=500-650mA,Isc=300mA ; 1:Iout=400-550mA,Isc=200mA*/
-#define LNBP21_PCL     0x80 /* [RW] short-circuit prot: 0=pulsed (dynamic) curr limiting; 1=static curr limiting*/
+/* [RO] 0=OK; 1=over current limit flag */
+#define LNBP21_OLF     0x01
+/* [RO] 0=OK; 1=over temperature flag (150 C) */
+#define LNBP21_OTF     0x02
+/* [RW] 0=disable LNB power, enable loopthrough
+       1=enable LNB power, disable loopthrough */
+#define LNBP21_EN      0x04
+/* [RW] 0=low voltage (13/14V, vert pol)
+       1=high voltage (18/19V,horiz pol) */
+#define LNBP21_VSEL    0x08
+/* [RW] increase LNB voltage by 1V:
+       0=13/18V; 1=14/19V */
+#define LNBP21_LLC     0x10
+/* [RW] 0=tone controlled by DSQIN pin
+       1=tone enable, disable DSQIN */
+#define LNBP21_TEN     0x20
+/* [RW] current limit select:
+       0:Iout=500-650mA Isc=300mA
+       1:Iout=400-550mA Isc=200mA */
+#define LNBP21_ISEL    0x40
+/* [RW] short-circuit protect:
+       0=pulsed (dynamic) curr limiting
+       1=static curr limiting */
+#define LNBP21_PCL     0x80
 
 #include <linux/dvb/frontend.h>
 
-#if defined(CONFIG_DVB_LNBP21) || (defined(CONFIG_DVB_LNBP21_MODULE) && defined(MODULE))
-/* override_set and override_clear control which system register bits (above) to always set & clear */
-extern struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 override_set, u8 override_clear);
+#if defined(CONFIG_DVB_LNBP21) || (defined(CONFIG_DVB_LNBP21_MODULE) \
+                                                       && defined(MODULE))
+/* override_set and override_clear control which
+ system register bits (above) to always set & clear */
+extern struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe,
+                               struct i2c_adapter *i2c, u8 override_set,
+                               u8 override_clear);
 #else
-static inline struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 override_set, u8 override_clear)
+static inline struct dvb_frontend *lnbp21_attach(struct dvb_frontend *fe,
+                               struct i2c_adapter *i2c, u8 override_set,
+                               u8 override_clear)
 {
        printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
        return NULL;
 }
-#endif // CONFIG_DVB_LNBP21
+#endif
 
-#endif // _LNBP21_H
+#endif