mantis_dvb.c revision f5ae4f6f482191c531ea9e50ac91d9bd2ffca171
141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham/*
241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	Mantis PCI bridge driver
341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu@gmail.com)
441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	This program is free software; you can redistribute it and/or modify
641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	it under the terms of the GNU General Public License as published by
741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	the Free Software Foundation; either version 2 of the License, or
841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	(at your option) any later version.
941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
1041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	This program is distributed in the hope that it will be useful,
1141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	but WITHOUT ANY WARRANTY; without even the implied warranty of
1241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	GNU General Public License for more details.
1441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
1541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	You should have received a copy of the GNU General Public License
1641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	along with this program; if not, write to the Free Software
1741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham*/
1941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
20b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/kernel.h>
2141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include <linux/bitops.h>
22b3b961448f702339444036f94252ff2ba7a99febManu Abraham
23b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/signal.h>
24b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/sched.h>
25b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/interrupt.h>
26b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/pci.h>
27b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/i2c.h>
2841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
2941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dmxdev.h"
3041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dvbdev.h"
3141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dvb_demux.h"
3241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dvb_frontend.h"
33b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvb_net.h"
3441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
35b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_common.h"
36b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_dma.h"
37b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_ca.h"
38b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_ioc.h"
39b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_dvb.h"
40616f75e1979f5bd1f3241581c720349c2c31f6e7Manu Abraham
41b3b961448f702339444036f94252ff2ba7a99febManu AbrahamDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
4241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
43b3b961448f702339444036f94252ff2ba7a99febManu Abrahamint mantis_frontend_power(struct mantis_pci *mantis, enum mantis_power power)
4441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
45b3b961448f702339444036f94252ff2ba7a99febManu Abraham	struct mantis_hwconfig *config = mantis->hwconfig;
46b3b961448f702339444036f94252ff2ba7a99febManu Abraham
47b3b961448f702339444036f94252ff2ba7a99febManu Abraham	switch (power) {
48b3b961448f702339444036f94252ff2ba7a99febManu Abraham	case POWER_ON:
49b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Power ON");
50b3b961448f702339444036f94252ff2ba7a99febManu Abraham		gpio_set_bits(mantis, config->power, POWER_ON);
51b3b961448f702339444036f94252ff2ba7a99febManu Abraham		msleep(100);
52b3b961448f702339444036f94252ff2ba7a99febManu Abraham		gpio_set_bits(mantis, config->power, POWER_ON);
53b3b961448f702339444036f94252ff2ba7a99febManu Abraham		msleep(100);
54b3b961448f702339444036f94252ff2ba7a99febManu Abraham		break;
5541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
56b3b961448f702339444036f94252ff2ba7a99febManu Abraham	case POWER_OFF:
57b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Power OFF");
58b3b961448f702339444036f94252ff2ba7a99febManu Abraham		gpio_set_bits(mantis, config->power, POWER_OFF);
59b3b961448f702339444036f94252ff2ba7a99febManu Abraham		msleep(100);
60b3b961448f702339444036f94252ff2ba7a99febManu Abraham		break;
6141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
62b3b961448f702339444036f94252ff2ba7a99febManu Abraham	default:
63b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Unknown state <%02x>", power);
64b3b961448f702339444036f94252ff2ba7a99febManu Abraham		return -1;
65b3b961448f702339444036f94252ff2ba7a99febManu Abraham	}
6641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
6741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
6841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
69b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_frontend_power);
7041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
71b3b961448f702339444036f94252ff2ba7a99febManu Abrahamvoid mantis_frontend_soft_reset(struct mantis_pci *mantis)
7241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
73b3b961448f702339444036f94252ff2ba7a99febManu Abraham	struct mantis_hwconfig *config = mantis->hwconfig;
74b3b961448f702339444036f94252ff2ba7a99febManu Abraham
75b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "Frontend RESET");
76b3b961448f702339444036f94252ff2ba7a99febManu Abraham	gpio_set_bits(mantis, config->reset, 0);
77b3b961448f702339444036f94252ff2ba7a99febManu Abraham	msleep(100);
78b3b961448f702339444036f94252ff2ba7a99febManu Abraham	gpio_set_bits(mantis, config->reset, 0);
79b3b961448f702339444036f94252ff2ba7a99febManu Abraham	msleep(100);
80b3b961448f702339444036f94252ff2ba7a99febManu Abraham	gpio_set_bits(mantis, config->reset, 1);
81b3b961448f702339444036f94252ff2ba7a99febManu Abraham	msleep(100);
82b3b961448f702339444036f94252ff2ba7a99febManu Abraham	gpio_set_bits(mantis, config->reset, 1);
83b3b961448f702339444036f94252ff2ba7a99febManu Abraham	msleep(100);
84b3b961448f702339444036f94252ff2ba7a99febManu Abraham
85b3b961448f702339444036f94252ff2ba7a99febManu Abraham	return;
86b3b961448f702339444036f94252ff2ba7a99febManu Abraham}
87b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_frontend_soft_reset);
88b3b961448f702339444036f94252ff2ba7a99febManu Abraham
89b3b961448f702339444036f94252ff2ba7a99febManu Abrahamstatic int mantis_frontend_shutdown(struct mantis_pci *mantis)
90b3b961448f702339444036f94252ff2ba7a99febManu Abraham{
91b3b961448f702339444036f94252ff2ba7a99febManu Abraham	int err;
92b3b961448f702339444036f94252ff2ba7a99febManu Abraham
93b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis_frontend_soft_reset(mantis);
94b3b961448f702339444036f94252ff2ba7a99febManu Abraham	err = mantis_frontend_power(mantis, POWER_OFF);
95b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (err != 0) {
96b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "Frontend POWER OFF failed! <%d>", err);
97b3b961448f702339444036f94252ff2ba7a99febManu Abraham		return 1;
98b3b961448f702339444036f94252ff2ba7a99febManu Abraham	}
9941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
10041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
10141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
10241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
10341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mantis_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
10441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
10541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
10641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct mantis_pci *mantis = dvbdmx->priv;
10741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
108b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "Mantis DVB Start feed");
10941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	if (!dvbdmx->dmx.frontend) {
110b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "no frontend ?");
11141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		return -EINVAL;
11241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
113b3b961448f702339444036f94252ff2ba7a99febManu Abraham
11441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->feeds++;
115b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "mantis start feed, feeds=%d",	mantis->feeds);
11641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
11741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	if (mantis->feeds == 1)	 {
118b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma");
11941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		mantis_dma_start(mantis);
12041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
12141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
12241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return mantis->feeds;
12341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
12441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
12541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
12641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
12741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
12841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct mantis_pci *mantis = dvbdmx->priv;
12941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
130b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "Mantis DVB Stop feed");
13141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	if (!dvbdmx->dmx.frontend) {
132b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "no frontend ?");
13341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		return -EINVAL;
13441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
135b3b961448f702339444036f94252ff2ba7a99febManu Abraham
13641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->feeds--;
13741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	if (mantis->feeds == 0) {
138b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma");
13941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		mantis_dma_stop(mantis);
14041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
141b3b961448f702339444036f94252ff2ba7a99febManu Abraham
14241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
14341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
14441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
14541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamint __devinit mantis_dvb_init(struct mantis_pci *mantis)
14641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
147b3b961448f702339444036f94252ff2ba7a99febManu Abraham	struct mantis_hwconfig *config = mantis->hwconfig;
148b3b961448f702339444036f94252ff2ba7a99febManu Abraham	int result = -1;
149b3b961448f702339444036f94252ff2ba7a99febManu Abraham
150b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "dvb_register_adapter");
151b3b961448f702339444036f94252ff2ba7a99febManu Abraham
152b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = dvb_register_adapter(&mantis->dvb_adapter,
153b3b961448f702339444036f94252ff2ba7a99febManu Abraham				      "Mantis DVB adapter",
154b3b961448f702339444036f94252ff2ba7a99febManu Abraham				      THIS_MODULE,
155b3b961448f702339444036f94252ff2ba7a99febManu Abraham				      &mantis->pdev->dev,
156b3b961448f702339444036f94252ff2ba7a99febManu Abraham				      adapter_nr);
15741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
158b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
15941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
160b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "Error registering adapter");
16141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		return -ENODEV;
16241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
163b3b961448f702339444036f94252ff2ba7a99febManu Abraham
164b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->dvb_adapter.priv	= mantis;
165b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.dmx.capabilities	= DMX_TS_FILTERING	|
16641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham					 DMX_SECTION_FILTERING	|
16741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham					 DMX_MEMORY_BASED_FILTERING;
16841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
169b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.priv		= mantis;
170b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.filternum		= 256;
171b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.feednum		= 256;
172b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.start_feed	= mantis_dvb_start_feed;
173b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.stop_feed		= mantis_dvb_stop_feed;
174b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.write_to_decoder	= NULL;
175b3b961448f702339444036f94252ff2ba7a99febManu Abraham
176b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "dvb_dmx_init");
177b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = dvb_dmx_init(&mantis->demux);
178b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
179b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
18041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
18141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err0;
18241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
183b3b961448f702339444036f94252ff2ba7a99febManu Abraham
184b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->dmxdev.filternum	= 256;
185b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->dmxdev.demux		= &mantis->demux.dmx;
186b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->dmxdev.capabilities	= 0;
187b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "dvb_dmxdev_init");
188b3b961448f702339444036f94252ff2ba7a99febManu Abraham
189b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = dvb_dmxdev_init(&mantis->dmxdev, &mantis->dvb_adapter);
190b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
191b3b961448f702339444036f94252ff2ba7a99febManu Abraham
192b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmxdev_init failed, ERROR=%d", result);
19341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err1;
19441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
19541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
196b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->fe_hw.source		= DMX_FRONTEND_0;
197b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_hw);
198b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
19941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
200b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
20141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err2;
20241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
20341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
204b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->fe_mem.source		= DMX_MEMORY_FE;
205f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham	result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_mem);
206b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
207f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
20841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err3;
20941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
21041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
211b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = mantis->demux.dmx.connect_frontend(&mantis->demux.dmx, &mantis->fe_hw);
212b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
213b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
21441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err4;
21541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
216b3b961448f702339444036f94252ff2ba7a99febManu Abraham
21741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx);
21841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis);
219b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (mantis->hwconfig) {
220b3b961448f702339444036f94252ff2ba7a99febManu Abraham		result = config->frontend_init(mantis, mantis->fe);
221b3b961448f702339444036f94252ff2ba7a99febManu Abraham		if (result < 0) {
222b3b961448f702339444036f94252ff2ba7a99febManu Abraham			dprintk(MANTIS_ERROR, 1, "!!! NO Frontends found !!!");
223b3b961448f702339444036f94252ff2ba7a99febManu Abraham			goto err5;
224b3b961448f702339444036f94252ff2ba7a99febManu Abraham		} else {
225b3b961448f702339444036f94252ff2ba7a99febManu Abraham			if (mantis->fe == NULL) {
226b3b961448f702339444036f94252ff2ba7a99febManu Abraham				dprintk(MANTIS_ERROR, 1, "FE <NULL>");
227b3b961448f702339444036f94252ff2ba7a99febManu Abraham				goto err5;
228b3b961448f702339444036f94252ff2ba7a99febManu Abraham			}
229b3b961448f702339444036f94252ff2ba7a99febManu Abraham
230b3b961448f702339444036f94252ff2ba7a99febManu Abraham			if (dvb_register_frontend(&mantis->dvb_adapter, mantis->fe)) {
231b3b961448f702339444036f94252ff2ba7a99febManu Abraham				dprintk(MANTIS_ERROR, 1, "ERROR: Frontend registration failed");
232b3b961448f702339444036f94252ff2ba7a99febManu Abraham
233b3b961448f702339444036f94252ff2ba7a99febManu Abraham				if (mantis->fe->ops.release)
234b3b961448f702339444036f94252ff2ba7a99febManu Abraham					mantis->fe->ops.release(mantis->fe);
235b3b961448f702339444036f94252ff2ba7a99febManu Abraham
236b3b961448f702339444036f94252ff2ba7a99febManu Abraham				mantis->fe = NULL;
237b3b961448f702339444036f94252ff2ba7a99febManu Abraham				goto err5;
238b3b961448f702339444036f94252ff2ba7a99febManu Abraham			}
239b3b961448f702339444036f94252ff2ba7a99febManu Abraham		}
240b3b961448f702339444036f94252ff2ba7a99febManu Abraham	}
241d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham
24241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
24341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
244b3b961448f702339444036f94252ff2ba7a99febManu Abraham	/* Error conditions ..	*/
245b3b961448f702339444036f94252ff2ba7a99febManu Abrahamerr5:
246b3b961448f702339444036f94252ff2ba7a99febManu Abraham	tasklet_kill(&mantis->tasklet);
247b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dvb_net_release(&mantis->dvbnet);
24868fe255cd15cf1fe04877fbbb0eafe80c43eff5dManu Abraham	dvb_unregister_frontend(mantis->fe);
24968fe255cd15cf1fe04877fbbb0eafe80c43eff5dManu Abraham	dvb_frontend_detach(mantis->fe);
25041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr4:
25141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
2523e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
25341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr3:
25441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
2553e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
25641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr2:
25741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_dmxdev_release(&mantis->dmxdev);
2583e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
25941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr1:
26041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_dmx_release(&mantis->demux);
2613e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
26241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr0:
26341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_unregister_adapter(&mantis->dvb_adapter);
26441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
26541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return result;
26641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
267b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_dvb_init);
26841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
269b3b961448f702339444036f94252ff2ba7a99febManu Abrahamint __devexit mantis_dvb_exit(struct mantis_pci *mantis)
27041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
271b3b961448f702339444036f94252ff2ba7a99febManu Abraham	int err;
27241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
2733e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham	if (mantis->fe) {
274f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham		/* mantis_ca_exit(mantis); */
2753e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham		err = mantis_frontend_shutdown(mantis);
2763e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham		if (err != 0)
2773e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham			dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
2783e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham		dvb_unregister_frontend(mantis->fe);
279c5e598a6f89ca7335db9f327e24e3abd13d137cfManu Abraham		dvb_frontend_detach(mantis->fe);
2803e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham	}
28141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
28241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	tasklet_kill(&mantis->tasklet);
28341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_net_release(&mantis->dvbnet);
2843e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
28541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
28641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
2873e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
28841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_dmxdev_release(&mantis->dmxdev);
28941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_dmx_release(&mantis->demux);
29041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
291b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "dvb_unregister_adapter");
29241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_unregister_adapter(&mantis->dvb_adapter);
29341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
29441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
29541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
296b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_dvb_exit);
297