2  * isl6421.h - driver for lnb supply and control ic ISL6421
 
   4  * Copyright (C) 2006 Andrew de Quincey
 
   5  * Copyright (C) 2006 Oliver Endriss
 
   7  * This program is free software; you can redistribute it and/or
 
   8  * modify it under the terms of the GNU General Public License
 
   9  * as published by the Free Software Foundation; either version 2
 
  10  * of the License, or (at your option) any later version.
 
  13  * This program is distributed in the hope that it will be useful,
 
  14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  16  * GNU General Public License for more details.
 
  19  * You should have received a copy of the GNU General Public License
 
  20  * along with this program; if not, write to the Free Software
 
  21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
  22  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
 
  25  * the project's page is at http://www.linuxtv.org
 
  27 #include <linux/delay.h>
 
  28 #include <linux/errno.h>
 
  29 #include <linux/init.h>
 
  30 #include <linux/kernel.h>
 
  31 #include <linux/module.h>
 
  32 #include <linux/moduleparam.h>
 
  33 #include <linux/string.h>
 
  34 #include <linux/slab.h>
 
  36 #include "dvb_frontend.h"
 
  43         struct i2c_adapter      *i2c;
 
  47 static int isl6421_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
 
  49         struct isl6421 *isl6421 = (struct isl6421 *) fe->sec_priv;
 
  50         struct i2c_msg msg = {  .addr = isl6421->i2c_addr, .flags = 0,
 
  51                                 .buf = &isl6421->config,
 
  52                                 .len = sizeof(isl6421->config) };
 
  54         isl6421->config &= ~(ISL6421_VSEL1 | ISL6421_EN1);
 
  60                 isl6421->config |= ISL6421_EN1;
 
  63                 isl6421->config |= (ISL6421_EN1 | ISL6421_VSEL1);
 
  69         isl6421->config |= isl6421->override_or;
 
  70         isl6421->config &= isl6421->override_and;
 
  72         return (i2c_transfer(isl6421->i2c, &msg, 1) == 1) ? 0 : -EIO;
 
  75 static int isl6421_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg)
 
  77         struct isl6421 *isl6421 = (struct isl6421 *) fe->sec_priv;
 
  78         struct i2c_msg msg = {  .addr = isl6421->i2c_addr, .flags = 0,
 
  79                                 .buf = &isl6421->config,
 
  80                                 .len = sizeof(isl6421->config) };
 
  83                 isl6421->config |= ISL6421_LLC1;
 
  85                 isl6421->config &= ~ISL6421_LLC1;
 
  87         isl6421->config |= isl6421->override_or;
 
  88         isl6421->config &= isl6421->override_and;
 
  90         return (i2c_transfer(isl6421->i2c, &msg, 1) == 1) ? 0 : -EIO;
 
  93 static void isl6421_release(struct dvb_frontend *fe)
 
  96         isl6421_set_voltage(fe, SEC_VOLTAGE_OFF);
 
 103 struct dvb_frontend *isl6421_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, u8 i2c_addr,
 
 104                    u8 override_set, u8 override_clear)
 
 106         struct isl6421 *isl6421 = kmalloc(sizeof(struct isl6421), GFP_KERNEL);
 
 110         /* default configuration */
 
 111         isl6421->config = ISL6421_ISEL1;
 
 113         isl6421->i2c_addr = i2c_addr;
 
 114         fe->sec_priv = isl6421;
 
 116         /* bits which should be forced to '1' */
 
 117         isl6421->override_or = override_set;
 
 119         /* bits which should be forced to '0' */
 
 120         isl6421->override_and = ~override_clear;
 
 122         /* detect if it is present or not */
 
 123         if (isl6421_set_voltage(fe, SEC_VOLTAGE_OFF)) {
 
 129         /* install release callback */
 
 130         fe->ops.release_sec = isl6421_release;
 
 132         /* override frontend ops */
 
 133         fe->ops.set_voltage = isl6421_set_voltage;
 
 134         fe->ops.enable_high_lnb_voltage = isl6421_enable_high_lnb_voltage;
 
 138 EXPORT_SYMBOL(isl6421_attach);
 
 140 MODULE_DESCRIPTION("Driver for lnb supply and control ic isl6421");
 
 141 MODULE_AUTHOR("Andrew de Quincey & Oliver Endriss");
 
 142 MODULE_LICENSE("GPL");