141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham/*
241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	Mantis VP-1034 driver
341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
48825a0970cef408fb2f1a44e3cb05d6ba41a18dbManu Abraham	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	This program is free software; you can redistribute it and/or modify
741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	it under the terms of the GNU General Public License as published by
841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	the Free Software Foundation; either version 2 of the License, or
941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	(at your option) any later version.
1041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
1141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	This program is distributed in the hope that it will be useful,
1241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	but WITHOUT ANY WARRANTY; without even the implied warranty of
1341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	GNU General Public License for more details.
1541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
1641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	You should have received a copy of the GNU General Public License
1741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	along with this program; if not, write to the Free Software
1841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham*/
2041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
21b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/signal.h>
22b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/sched.h>
23b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/interrupt.h>
24b7f080cfe223b3b7424872639d153695615a9255Alexey Dobriyan#include <asm/io.h>
25b3b961448f702339444036f94252ff2ba7a99febManu Abraham
26b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dmxdev.h"
27b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvbdev.h"
28b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvb_demux.h"
29b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvb_frontend.h"
30b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvb_net.h"
31b3b961448f702339444036f94252ff2ba7a99febManu Abraham
32b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mb86a16.h"
3341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "mantis_common.h"
34b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_ioc.h"
35bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham#include "mantis_dvb.h"
3641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "mantis_vp1034.h"
37b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_reg.h"
3841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
39b3b961448f702339444036f94252ff2ba7a99febManu Abrahamstruct mb86a16_config vp1034_mb86a16_config = {
4041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	.demod_address	= 0x08,
4141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	.set_voltage	= vp1034_set_voltage,
4241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham};
4341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
44df0cca174b4d85ea041509a13e5e68b377758bf1Manu Abraham#define MANTIS_MODEL_NAME	"VP-1034"
45df0cca174b4d85ea041509a13e5e68b377758bf1Manu Abraham#define MANTIS_DEV_TYPE		"DVB-S/DSS"
46df0cca174b4d85ea041509a13e5e68b377758bf1Manu Abraham
4741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamint vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
4841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
4941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct mantis_pci *mantis = fe->dvb->priv;
5041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
5141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	switch (voltage) {
5241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	case SEC_VOLTAGE_13:
53b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "Polarization=[13V]");
543037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings		mantis_gpio_set_bits(mantis, 13, 1);
553037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings		mantis_gpio_set_bits(mantis, 14, 0);
5641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		break;
5741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	case SEC_VOLTAGE_18:
58b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "Polarization=[18V]");
593037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings		mantis_gpio_set_bits(mantis, 13, 1);
603037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings		mantis_gpio_set_bits(mantis, 14, 1);
6141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		break;
6241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	case SEC_VOLTAGE_OFF:
63b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
6441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		break;
6541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	default:
66f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham		dprintk(MANTIS_ERROR, 1, "Invalid = (%d)", (u32) voltage);
6741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		return -EINVAL;
6841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
6941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mmwrite(0x00, MANTIS_GPIF_DOUT);
7041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
7141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
7241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
73b3b961448f702339444036f94252ff2ba7a99febManu Abraham
74b3b961448f702339444036f94252ff2ba7a99febManu Abrahamstatic int vp1034_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
75b3b961448f702339444036f94252ff2ba7a99febManu Abraham{
76b3b961448f702339444036f94252ff2ba7a99febManu Abraham	struct i2c_adapter *adapter	= &mantis->adapter;
77b3b961448f702339444036f94252ff2ba7a99febManu Abraham
78bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham	int err = 0;
79b3b961448f702339444036f94252ff2ba7a99febManu Abraham
80bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham	err = mantis_frontend_power(mantis, POWER_ON);
81bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham	if (err == 0) {
82bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham		mantis_frontend_soft_reset(mantis);
83bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham		msleep(250);
84bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham
85bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham		dprintk(MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
86a22407faba57c3624beea1a9fad7cbdcf5a19a1aBjørn Mork		fe = dvb_attach(mb86a16_attach, &vp1034_mb86a16_config, adapter);
87bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham		if (fe) {
88bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham			dprintk(MANTIS_ERROR, 1,
89bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham			"found MB86A16 DVB-S/DSS frontend @0x%02x",
90bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham			vp1034_mb86a16_config.demod_address);
91bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham
92bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham		} else {
93bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham			return -1;
94bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham		}
95b3b961448f702339444036f94252ff2ba7a99febManu Abraham	} else {
96bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham		dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
97bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham			adapter->name,
98bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham			err);
99b3b961448f702339444036f94252ff2ba7a99febManu Abraham
100bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham		return -EIO;
101bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham	}
102b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->fe = fe;
103b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_ERROR, 1, "Done!");
104b3b961448f702339444036f94252ff2ba7a99febManu Abraham
105b3b961448f702339444036f94252ff2ba7a99febManu Abraham	return 0;
106b3b961448f702339444036f94252ff2ba7a99febManu Abraham}
107b3b961448f702339444036f94252ff2ba7a99febManu Abraham
108b3b961448f702339444036f94252ff2ba7a99febManu Abrahamstruct mantis_hwconfig vp1034_config = {
109b3b961448f702339444036f94252ff2ba7a99febManu Abraham	.model_name	= MANTIS_MODEL_NAME,
110b3b961448f702339444036f94252ff2ba7a99febManu Abraham	.dev_type	= MANTIS_DEV_TYPE,
111b3b961448f702339444036f94252ff2ba7a99febManu Abraham	.ts_size	= MANTIS_TS_204,
112b3b961448f702339444036f94252ff2ba7a99febManu Abraham
113b3b961448f702339444036f94252ff2ba7a99febManu Abraham	.baud_rate	= MANTIS_BAUD_9600,
114b3b961448f702339444036f94252ff2ba7a99febManu Abraham	.parity		= MANTIS_PARITY_NONE,
115b3b961448f702339444036f94252ff2ba7a99febManu Abraham	.bytes		= 0,
116b3b961448f702339444036f94252ff2ba7a99febManu Abraham
117b3b961448f702339444036f94252ff2ba7a99febManu Abraham	.frontend_init	= vp1034_frontend_init,
118bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham	.power		= GPIF_A12,
119bc832fa2c0310c25ed60204616ccef4f8db088f3Manu Abraham	.reset		= GPIF_A13,
120b3b961448f702339444036f94252ff2ba7a99febManu Abraham};
121