linux/drivers/media/pci/mantis/mantis_vp1034.c
<<
>>
Prefs
   1/*
   2        Mantis VP-1034 driver
   3
   4        Copyright (C) Manu Abraham (abraham.manu@gmail.com)
   5
   6        This program is free software; you can redistribute it and/or modify
   7        it under the terms of the GNU General Public License as published by
   8        the Free Software Foundation; either version 2 of the License, or
   9        (at your option) any later version.
  10
  11        This program is distributed in the hope that it will be useful,
  12        but WITHOUT ANY WARRANTY; without even the implied warranty of
  13        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14        GNU General Public License for more details.
  15
  16        You should have received a copy of the GNU General Public License
  17        along with this program; if not, write to the Free Software
  18        Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19*/
  20
  21#include <linux/signal.h>
  22#include <linux/sched.h>
  23#include <linux/interrupt.h>
  24#include <asm/io.h>
  25
  26#include "dmxdev.h"
  27#include "dvbdev.h"
  28#include "dvb_demux.h"
  29#include "dvb_frontend.h"
  30#include "dvb_net.h"
  31
  32#include "mb86a16.h"
  33#include "mantis_common.h"
  34#include "mantis_ioc.h"
  35#include "mantis_dvb.h"
  36#include "mantis_vp1034.h"
  37#include "mantis_reg.h"
  38
  39static struct mb86a16_config vp1034_mb86a16_config = {
  40        .demod_address  = 0x08,
  41        .set_voltage    = vp1034_set_voltage,
  42};
  43
  44#define MANTIS_MODEL_NAME       "VP-1034"
  45#define MANTIS_DEV_TYPE         "DVB-S/DSS"
  46
  47int vp1034_set_voltage(struct dvb_frontend *fe, enum fe_sec_voltage voltage)
  48{
  49        struct mantis_pci *mantis = fe->dvb->priv;
  50
  51        switch (voltage) {
  52        case SEC_VOLTAGE_13:
  53                dprintk(MANTIS_ERROR, 1, "Polarization=[13V]");
  54                mantis_gpio_set_bits(mantis, 13, 1);
  55                mantis_gpio_set_bits(mantis, 14, 0);
  56                break;
  57        case SEC_VOLTAGE_18:
  58                dprintk(MANTIS_ERROR, 1, "Polarization=[18V]");
  59                mantis_gpio_set_bits(mantis, 13, 1);
  60                mantis_gpio_set_bits(mantis, 14, 1);
  61                break;
  62        case SEC_VOLTAGE_OFF:
  63                dprintk(MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
  64                break;
  65        default:
  66                dprintk(MANTIS_ERROR, 1, "Invalid = (%d)", (u32) voltage);
  67                return -EINVAL;
  68        }
  69        mmwrite(0x00, MANTIS_GPIF_DOUT);
  70
  71        return 0;
  72}
  73
  74static int vp1034_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
  75{
  76        struct i2c_adapter *adapter     = &mantis->adapter;
  77
  78        int err = 0;
  79
  80        err = mantis_frontend_power(mantis, POWER_ON);
  81        if (err == 0) {
  82                mantis_frontend_soft_reset(mantis);
  83                msleep(250);
  84
  85                dprintk(MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
  86                fe = dvb_attach(mb86a16_attach, &vp1034_mb86a16_config, adapter);
  87                if (fe) {
  88                        dprintk(MANTIS_ERROR, 1,
  89                        "found MB86A16 DVB-S/DSS frontend @0x%02x",
  90                        vp1034_mb86a16_config.demod_address);
  91
  92                } else {
  93                        return -1;
  94                }
  95        } else {
  96                dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
  97                        adapter->name,
  98                        err);
  99
 100                return -EIO;
 101        }
 102        mantis->fe = fe;
 103        dprintk(MANTIS_ERROR, 1, "Done!");
 104
 105        return 0;
 106}
 107
 108struct mantis_hwconfig vp1034_config = {
 109        .model_name     = MANTIS_MODEL_NAME,
 110        .dev_type       = MANTIS_DEV_TYPE,
 111        .ts_size        = MANTIS_TS_204,
 112
 113        .baud_rate      = MANTIS_BAUD_9600,
 114        .parity         = MANTIS_PARITY_NONE,
 115        .bytes          = 0,
 116
 117        .frontend_init  = vp1034_frontend_init,
 118        .power          = GPIF_A12,
 119        .reset          = GPIF_A13,
 120};
 121